コード例 #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
ファイル: Kernel.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Float.cs プロジェクト: chunlea/rubydotnetcompiler
 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
ファイル: Sprintf.cs プロジェクト: chunlea/rubydotnetcompiler
 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
ファイル: Time.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Class.cs プロジェクト: chunlea/rubydotnetcompiler
 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
ファイル: File.cs プロジェクト: chunlea/rubydotnetcompiler
        // -------------------------------------------------------------

        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
ファイル: Eval.cs プロジェクト: chunlea/rubydotnetcompiler
 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
ファイル: String.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: File.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Frame.cs プロジェクト: chunlea/rubydotnetcompiler
 public Frame(Frame caller)
 {
     this.caller = caller;
     // default visibility is private at toplevel
     if (caller == null)
         scope_vmode = Access.Private;
 }
コード例 #18
0
ファイル: GC.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Random.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Env.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Random.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Env.cs プロジェクト: chunlea/rubydotnetcompiler
 internal static String env_str_new2(Frame caller, string str)
 {
     if (str == null)
         return null;
     else
         return env_str_new(caller, str);
 }
コード例 #26
0
ファイル: Match.cs プロジェクト: chunlea/rubydotnetcompiler
 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
ファイル: Integer.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Env.cs プロジェクト: chunlea/rubydotnetcompiler
        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
ファイル: Range.cs プロジェクト: chunlea/rubydotnetcompiler
 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
ファイル: String.cs プロジェクト: chunlea/rubydotnetcompiler
 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;
 }