Пример #1
0
        public override object Call0(Class last_class, object recv, Frame caller, Proc block)
        {
            ProcessStatus status = ((ProcessStatus)recv);

            System.Text.StringBuilder buf = new System.Text.StringBuilder();

            buf.Append(string.Format(CultureInfo.InvariantCulture, "#<{0}: pid={1}", status.my_class._name, status.pid));
            if (status.WIFSTOPPED())
            {
                int stopsig = status.WSTOPSIG();
                string signame = Signal.ruby_signal_name(stopsig);
                if (signame != null)
                    buf.Append(string.Format(CultureInfo.InvariantCulture, ",stopped(SIG{0}={1})", signame, stopsig));
                else
                    buf.Append(string.Format(CultureInfo.InvariantCulture, ",stopped({0})", stopsig));
            }
            if (status.WIFSIGNALED())
            {
                int termsig = status.WTERMSIG();
                string signame = Signal.ruby_signal_name(termsig);
                if (signame != null)
                    buf.Append(string.Format(CultureInfo.InvariantCulture, ",signaled(SIG{0}={1})", signame, termsig));
                else
                    buf.Append(string.Format(CultureInfo.InvariantCulture, ",signaled({0})", termsig));
            }
            if (status.WIFEXITED())
            {
                buf.Append(string.Format(CultureInfo.InvariantCulture, ",exited({0})", status.WEXITSTATUS()));
            }
            buf.Append(">");

            return new String(buf.ToString());
        }
Пример #2
0
        internal override object const_get(string name, bool recurse, Frame caller)
        {
            if (instance_vars.ContainsKey(name))
                return instance_vars[name];

            Class c = super;

            while (c != null)
            {
                if (c.instance_vars.ContainsKey(name))
                    return c.instance_vars[name];

                c = c.super;
            }

            if (Init.rb_cClass.instance_vars.ContainsKey(name))
                return Init.rb_cClass.instance_vars[name];

            if (Init.rb_cModule.instance_vars.ContainsKey(name))
                return Init.rb_cModule.instance_vars[name];

            if (Init.rb_cObject.instance_vars.ContainsKey(name))
                return Init.rb_cObject.instance_vars[name];

            return Eval.CallPrivate(this, caller, "const_missing", null, new Symbol(name));
        }
Пример #3
0
        public override object Call0(Class last_class, object recv, Frame caller, Proc block)
        {
            Class klass0 = Class.CLASS_OF(recv);

            return klass0.class_real();

        }
Пример #4
0
        public override object Call(Class last_class, object recv, Frame caller, Proc block, Array rest)
        {
            if ((rest.Count == 0) || ((rest.Count == 0) && (rest.value[0].Equals(recv))))
                return recv;

            return Eval.CallPrivate(rest.value[0], caller, "new", block, rest);
        }
Пример #5
0
 internal static int Compare(object a, object b, Frame caller) //status: done
 {
     object value = Eval.CallPrivate(a, caller, "<=>", null, b);
     if (value == null)
     {
         throw new ArgumentError(string.Format(CultureInfo.InvariantCulture, "comparison of {0} with {1} failed", Class.rb_obj_classname(a), Class.rb_obj_classname(b))).raise(caller);
     }
     else if (value is int)
     {
         return (int)value;
     }
     else if (value is Bignum)
     {
         return ((Bignum)value).value >= 0 ? 1 : -1;
     }
     else if ((bool)Eval.CallPrivate(value, caller, ">", null, 0))
     {
         return 1;
     }
     else if ((bool)Eval.CallPrivate(value, caller, "<", null, 0))
     {
         return -1;
     }
     else
     {
         return 0;
     }
 }
Пример #6
0
 internal static Float rb_Float(object o, Frame caller)
 {
     if (o is int)
     {
         return new Float((double)(int)o);
     }
     else if (o is double)
     {
         return new Float((double)o);
     }
     else if (o is Bignum)
     {
         return new Float((double)((Bignum)o).value);
     }
     else if (o is String)
     {
         return new Float(String.rb_str_to_dbl(caller, (String)o, true));
     }
     else if (o == null)
     {
         throw new  TypeError("cannot convert nil into Float").raise(caller);
     }
     else
     {
         Float f = Object.Convert<Float>(o, "to_f", caller);
         if (System.Double.IsNaN(f.value))
         {
             throw new ArgumentError("invalid value for Float()").raise(caller);
         }
         else
         {
             return f;
         }
     }
 }
Пример #7
0
 internal static int GETASTER(ref int t, ref int p, out int n, int end,
     string fmtString, ref int posArg, ref int nextArg,
     object nextValue, object tmp, Array argv, Frame caller)
 {
     t = p++;
     n = 0;
     for (; p < end && char.IsDigit(fmtString[p]); p++)
     {
         n = 10 * n + (fmtString[p] - '0');
     }
     if (p >= end)
     {
         throw new ArgumentError("malformed format string - %*[0-9]").raise(caller);
     }
     if (fmtString[p] == '$')
     {
         tmp = GETPOSARG(caller, n, ref posArg, argv);
     }
     else
     {
         tmp = GETARG(caller, ref posArg, ref nextArg, nextValue, argv);
         p = t;
     }
     return Numeric.rb_num2long(tmp, caller);
 }
Пример #8
0
        public override object Call(Class last_class, object recv, Frame caller, Proc block, Array rest)
        {
            object time, t;            
            long seconds = 0;
            long uSeconds = 0;

            if (Class.rb_scan_args(caller, rest, 1, 1, false) == 2)
            {
                time = rest[0];
                t = rest[1];
                seconds = Numeric.rb_num2long(rest[0], caller);
                uSeconds = Numeric.rb_num2long(rest[1], caller);
            }
            else 
            {
                time = rest[0];
                Time.rb_time_timeval(rest[0], out seconds, out uSeconds, caller);
            }

            if (time is Time)
            {
                bool gmt = ((Time)time).gmt;
                t = Time.time_new_internal(seconds, uSeconds, gmt, caller);
            }
            else
            {
                t = Time.time_new_internal(seconds, uSeconds, false, caller);
                ((Time)t).value = ((Time)t).value.ToLocalTime();
            }

            return t;
        }
Пример #9
0
        public override object Call1(Class last_class, object recv, Frame caller, Proc block, object param0)
        {
            if (param0 is bool)
                return (bool)param0;

            return param0 != null;
        }
Пример #10
0
 public override object Call0(Class last_class, object recv, Frame caller, Proc block)
 {
     // this functionality seems to be getting done in another method
     // could not find a testing sequence that made this fail. Although
     // Eval.getConst only calls it under certain circumstances. 
     return Init.rb_cObject.get_constants();
 }
Пример #11
0
        // -------------------------------------------------------------

        internal static void chmod_internal(string path, int mode, Frame caller)
        {
            if (chmod(path, mode) < 0)
            {
                throw SystemCallError.rb_sys_fail(path, new System.IO.IOException(), caller).raise(caller);
            }
        }
Пример #12
0
 public override object Calln(Class last_class, object recv, Frame caller, ArgList args)
 {
     if (args.Length == 0)
         return Call1(last_class, recv, caller, args.block, 1);
     else
         return Call1(last_class, recv, caller, args.block, args[0]);
 }
Пример #13
0
 internal override object getter(string id, Frame caller)
 {
     Match tilde;
     switch (aliased)
     {
         case "$&":
             tilde = caller.Tilde;
             if (tilde != null)
                 return tilde.last_match(caller);
             else
                 return null;
         case "$`":
             tilde = caller.Tilde;
             if (tilde != null)
                 return tilde.match_pre(caller);
             else
                 return null;
         case "$'":
             tilde = caller.Tilde;
             if (tilde != null)
                 return tilde.match_post(caller);
             else
                 return null;
         case "$+":
             tilde = caller.Tilde;
             if (tilde != null)
                 return tilde.match_last(caller);
             else
                 return null;
         default:
             break;
     }
     return Variables.gvar_get(aliased, caller);
 }
Пример #14
0
        internal override void setter(string id, object val, Frame caller)
        {
            if ((val != null) && !(val is String))
                throw new TypeError(string.Format(CultureInfo.InvariantCulture, "value of {0} must be String", id)).raise(caller);

            this.value = val;
        }
Пример #15
0
        public override object Call(Class last_class, object str, Frame caller, Proc block, Array argv)
        {
            int argc = argv.Count;
            object result;

            if (argc < 1 || 2 < argc)
            {
                throw new ArgumentError(string.Format(CultureInfo.InvariantCulture, "wrong number of arguments ({0} for 1)", argc)).raise(caller);
            }

            Array buf = new Array();
            int i;
            for (i = 0; i < argc; i++)
            {
                buf.Add(argv[i]);
            }
            result = rb_str_aref_m.singleton.Call(last_class, str, caller, null, buf);
            
            if (result != null)
            {
                buf.Add(new String());
                rb_str_aset_m.singleton.Call(last_class, str, caller, null, buf);
            }

            return result;
        }            
Пример #16
0
        public override object Call1(Class last_class, object recv, Frame caller, Proc block, object p1)
        {
            string path = String.StringValue(p1, caller);

            Eval.rb_secure(2, caller);
            return new FileStat(path);
        }
Пример #17
0
 public Frame(Frame caller)
 {
     this.caller = caller;
     // default visibility is private at toplevel
     if (caller == null)
         scope_vmode = Access.Private;
 }
Пример #18
0
        public override object Call0(Class last_class, object recv, Frame caller, Proc block)
        {
            bool old = GC.dont_gc;

            GC.dont_gc = true;
            return old;
        }
Пример #19
0
 public override object Call1(Class last_class, object recv, Frame caller, Proc block, object p1)
 {
     if (recv == p1)
         return true;
     else
         return Object.Equals(((ProcessStatus)recv).st, p1);
 }
Пример #20
0
        public override object Call1(Class last_class, object recv, Frame caller, Proc block, object p1)
        {
            if (Numeric.random == null)
                rb_f_srand.singleton.Call0(last_class, recv, caller, null);
                        
            int max;
            if (p1 == null)
                max = 0;
            else if (p1 is int)
                max = (int)p1;
            else if (p1 is Bignum)
                return rb_big_rand((Bignum)p1, Numeric.random.NextDouble());
            else if (p1 is Float)
            {
                if (((Float)p1).value <= int.MaxValue && ((Float)p1).value >= int.MinValue)
                    max = (int)((Float)p1).value;
                else
                    return rb_big_rand(new Bignum(((Float)p1).value), Numeric.random.NextDouble());
            }
            else
            {
                p1 = Integer.rb_Integer(p1, caller);
                if (p1 is Bignum)
                    return rb_big_rand((Bignum)p1, Numeric.random.NextDouble());
                max = (int)System.Math.Abs(Numeric.rb_num2long(p1, caller));
            }

            if (max == 0)
                return new Float(Numeric.random.NextDouble());
            else if (max < 0)
                max = -max;

            return (int)(max * Numeric.random.NextDouble());
        }
Пример #21
0
        public override object Call(Class klass, object recv, Frame caller, Proc block, Array rest)
        {
            int count = Class.rb_scan_args(caller, rest, 1, 1, false);

            if (block != null && count == 2)
            {
                Errors.rb_warn("block supersedes default value argument");
            }

            object if_none = null;
            if (count == 2)
                if_none = rest[1];

            string name = String.StringValue(rest[0], caller);
            string val = System.Environment.GetEnvironmentVariable(name);

            if (val == null)
            {
                if (block != null)
                    return Proc.rb_yield(block, caller, rest[0]);

                if (if_none != null)
                    return if_none;

                throw new IndexError("key not found").raise(caller);
            }
            else if (Env.PATH_ENV.Equals(name, System.StringComparison.OrdinalIgnoreCase) && !Env.rb_env_path_tainted())
                return new String(val);
            else
                return Env.env_str_new2(caller, val);
        }
Пример #22
0
        public override object Call1(Class last_class, object recv, Frame caller, Proc block, object p1)
        {
            Object.CheckType<Class>(caller, p1);

            Class.rb_define_singleton_method(p1, "induced_from", prec_induced_from.singleton, 1, caller);
            return recv;
        }
Пример #23
0
        public override object Call0(Class last_class, object recv, Frame caller, Proc block)
        {
            if (Numeric.random == null)
                rb_f_srand.singleton.Call0(last_class, recv, caller, null);

            return new Float(Numeric.random.NextDouble());
        }
Пример #24
0
 public static object gvar_get(string gvar_name, Frame caller)
 {
     if (global_vars.ContainsKey(gvar_name))
         return global_vars[gvar_name].getter(gvar_name, caller);
     else
         return null;
 }
Пример #25
0
 internal static String env_str_new2(Frame caller, string str)
 {
     if (str == null)
         return null;
     else
         return env_str_new(caller, str);
 }
Пример #26
0
 public override object Call0(Class last_class, object recv, Frame caller, Proc block)
 {
     Match md = (Match)recv;
     String str = new String(md.matched.Substring(0, md.value.Index));
     if (md.Tainted) str.Tainted = true;
     return str;
 }
Пример #27
0
        public override object Call1(Class last_class, object from, Frame caller, Proc block, object to)
        {
            if (from is int && to is int)
            {
                int end = (int)to;

                if (block == null)
                    throw new LocalJumpError("no block given").raise(caller);

                for (int i = (int)from; i <= end; i++)
                    Proc.rb_yield(block, caller, i);
            }
            else
            {
                object i = from;
                while (!(bool)Eval.CallPrivate(i, caller, ">", null, to))
                {
                    if (block == null)
                        throw new LocalJumpError("no block given").raise(caller);

                    Proc.rb_yield(block, caller, i);
                    i = Eval.CallPrivate(i, caller, "+", null, 1);
                }
            }

            return from;
        }
Пример #28
0
        internal static String env_str_new(Frame caller, string str)
        {
            String s = new String(str);
            s.Tainted = true;
            Object.rb_obj_freeze(caller, s);

            return s;
        }
Пример #29
0
 internal static bool LT(object x, object y, Frame caller)
 {
     object result = Eval.CallPrivate(x, caller, "<=>", null, y);
     if (result is int)
         return 0 > (int)result;
     else
         return false;
 }
Пример #30
0
 public override object Call1(Class last_class, object recv, Frame caller, Proc block, object param0)
 {
     String str = new String(((String)recv).value + String.StringValue(param0, caller));
     if (((recv is Basic) && (((Basic)recv).Tainted)) ||
         ((param0 is Basic) && (((Basic)param0).Tainted)))
         str.Tainted = true;
     return str;
 }