static ILuaMultiValue _read(int[] opts, StreamReader s, ILuaEnvironment E)
            {
                List <ILuaValue> ret = new List <ILuaValue>();

                foreach (var item in opts)
                {
                    switch (item)
                    {
                    case -4:
                        ret.Add(E.Runtime.CreateValue(s.EndOfStream ? null : s.ReadLine() + "\n"));
                        break;

                    case -3:
                        ret.Add(E.Runtime.CreateValue(s.EndOfStream ? null : s.ReadLine()));
                        break;

                    case -2:
                        ret.Add(E.Runtime.CreateValue(s.EndOfStream ? null : s.ReadToEnd()));
                        break;

                    case -1:
                        if (s.EndOfStream)
                        {
                            ret.Add(null);
                        }
                        else
                        {
                            double?d = NetHelpers.ReadNumber(s);
                            if (d.HasValue)
                            {
                                ret.Add(E.Runtime.CreateValue(d.Value));
                            }
                            else
                            {
                                ret.Add(LuaNil.Nil);
                            }
                        }
                        break;

                    default:
                        if (s.EndOfStream)
                        {
                            ret.Add(null);
                        }
                        else
                        {
                            char[] c = new char[item];
                            s.Read(c, 0, item);
                            ret.Add(E.Runtime.CreateValue(new string(c)));
                        }
                        break;
                    }
                }

                return(E.Runtime.CreateMultiValue(ret.ToArray()));
            }