Beispiel #1
0
        public static HassiumList getsourcereps(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
        {
            HassiumList list = new HassiumList(new HassiumObject[0]);

            if (args[0] is HassiumFunction)
            {
                var a = (args[0] as HassiumFunction).Target.Method.GetCustomAttributes(typeof(FunctionAttribute), false);
                if (a.Length > 0)
                {
                    var reps = (a[0] as FunctionAttribute).SourceRepresentations;
                    foreach (var rep in reps)
                    {
                        HassiumList.add(vm, list, location, new HassiumString(rep));
                    }
                }
            }
            else if (args[0] is HassiumMethod)
            {
                HassiumList.add(vm, list, location, new HassiumString((args[0] as HassiumMethod).SourceRepresentation));
            }
            else if (args[0] is HassiumMultiFunc)
            {
                HassiumList.add(vm, list, location, new HassiumString((args[0] as HassiumMultiFunc).Methods[0].SourceRepresentation));
            }
            else if (args[0] is HassiumProperty)
            {
                var property = (args[0] as HassiumProperty);
                HassiumList.add(vm, list, location, new HassiumString((property.Get as HassiumFunction).GetTopSourceRep()));
                if (property.Set != null)
                {
                    HassiumList.add(vm, list, location, new HassiumString((property.Set as HassiumFunction).GetTopSourceRep()));
                }
            }
            return(list);
        }
Beispiel #2
0
        public static HassiumList getdocreqparams(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
        {
            var list = new HassiumList(new HassiumObject[0]);

            if (args[0] is HassiumFunction)
            {
                var a = (args[0] as HassiumFunction).Target.Method.GetCustomAttributes(typeof(DocStrAttribute), false);
                if (a.Length > 0)
                {
                    foreach (var param in (a[0] as DocStrAttribute).RequiredParams)
                    {
                        HassiumList.add(vm, list, location, new HassiumString(param));
                    }
                }
            }
            else if (args[0] is HassiumMethod)
            {
                var meth = (args[0] as HassiumMethod);
                if (meth.DocStr != null)
                {
                    foreach (var param in meth.DocStr.RequiredParams)
                    {
                        HassiumList.add(vm, list, location, new HassiumString(param));
                    }
                }
            }

            return(list);
        }
Beispiel #3
0
        public static HassiumList getparamlengths(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
        {
            HassiumList list = new HassiumList(new HassiumObject[0]);

            if (args[0] is HassiumFunction)
            {
                foreach (int len in (args[0] as HassiumFunction).ParameterLengths)
                {
                    HassiumList.add(vm, list, location, new HassiumInt(len));
                }
            }
            else if (args[0] is HassiumMethod)
            {
                HassiumList.add(vm, list, location, new HassiumInt((args[0] as HassiumMethod).Parameters.Count));
            }
            else if (args[0] is HassiumMultiFunc)
            {
                foreach (var method in (args[0] as HassiumMultiFunc).Methods)
                {
                    HassiumList.add(vm, list, location, new HassiumInt(method.Parameters.Count));
                }
            }

            return(list);
        }
Beispiel #4
0
        public HassiumObject Execute(HassiumModule module, HassiumList args, Dictionary <int, HassiumObject> frame = null)
        {
            CallStack        = new LinkedStack <string>();
            CurrentModule    = module;
            ExceptionReturns = new Dictionary <HassiumMethod, int>();
            Globals          = module.BoundAttributes["__global__"].BoundAttributes;
            Handlers         = new Stack <HassiumExceptionHandler>();
            Stack            = new LinkedStack <HassiumObject>();
            StackFrame       = new StackFrame();
            ImportGlobals();

            var globalClass = module.GetAttribute(this, "__global__");

            (globalClass.GetAttribute(this, "__init__") as HassiumMethod).Invoke(this, new SourceLocation("", 0, 0));
            GlobalFrame = StackFrame.Frames.Peek();

            if (globalClass.ContainsAttribute("main"))
            {
                var mainMethod = (globalClass.GetAttribute(this, "main") as HassiumMethod);
                if (mainMethod.Parameters.Count > 0)
                {
                    mainMethod.Invoke(this, mainMethod.SourceLocation, args);
                }
                else
                {
                    mainMethod.Invoke(this, mainMethod.SourceLocation);
                }
            }

            return(lastValuePopped);
        }
Beispiel #5
0
            public static HassiumObject readalllines(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                var file = (self as HassiumFile);

                if (!File.Exists(file.AbsolutePath.String))
                {
                    vm.RaiseException(HassiumFileNotFoundException.FileNotFoundExceptionTypeDef._new(vm, null, location, file.AbsolutePath));
                    return(Null);
                }

                if (file.closed)
                {
                    vm.RaiseException(HassiumFileClosedException.FileClosedExceptionTypeDef._new(vm, null, location, self, get_abspath(vm, self, location)));
                    return(Null);
                }

                HassiumList list = new HassiumList(new HassiumObject[0]);

                file.Reader.BaseStream.Position = 0;
                while (file.Reader.BaseStream.Position < file.Reader.BaseStream.Length)
                {
                    HassiumList.add(vm, list, location, readline(vm, self, location));
                }

                return(list);
            }
Beispiel #6
0
            public static HassiumObject readbytes(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                var file = (self as HassiumFile);

                if (!File.Exists(file.AbsolutePath.String))
                {
                    vm.RaiseException(HassiumFileNotFoundException.FileNotFoundExceptionTypeDef._new(vm, null, location, file.AbsolutePath));
                    return(Null);
                }

                if (file.closed)
                {
                    vm.RaiseException(HassiumFileClosedException.FileClosedExceptionTypeDef._new(vm, null, location, self, get_abspath(vm, self, location)));
                    return(Null);
                }

                HassiumList list  = new HassiumList(new HassiumObject[0]);
                int         count = (int)args[0].ToInt(vm, args[0], location).Int;

                for (int i = 0; i < count; i++)
                {
                    HassiumList.add(vm, list, location, new HassiumChar((char)file.Reader.ReadBytes(1)[0]));
                }

                return(list);
            }
Beispiel #7
0
            public HassiumList listfiles(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                HassiumList result = new HassiumList(new HassiumObject[0]);

                foreach (string dir in Directory.GetFiles(args[0].ToString(vm, args[0], location).String))
                {
                    HassiumList.add(vm, result, location, new HassiumString(dir));
                }
                return(result);
            }
Beispiel #8
0
            public HassiumList getvars(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                HassiumList variables = new HassiumList(new HassiumObject[0]);

                foreach (var var_ in Environment.GetEnvironmentVariables())
                {
                    HassiumList.add(vm, variables, location, new HassiumString(var_.ToString()));
                }

                return(variables);
            }
Beispiel #9
0
            public static HassiumList split(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                HassiumList list = new HassiumList(new HassiumObject[0]);

                foreach (var str in Regex.Split(args[1].ToString(vm, args[1], location).String, args[0].ToString(vm, args[0], location).String))
                {
                    HassiumList.ListTypeDef.add(vm, list, location, new HassiumString(str));
                }

                return(list);
            }
Beispiel #10
0
        public static HassiumList map(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
        {
            var         list   = args[0].ToList(vm, args[0], location).Values;
            HassiumList result = new HassiumList(new HassiumObject[0]);

            for (int i = 0; i < list.Count; i++)
            {
                HassiumList.add(vm, result, location, args[1].Invoke(vm, location, list[i]));
            }

            return(result);
        }
Beispiel #11
0
            public HassiumList getips(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                HassiumList list = new HassiumList(new HassiumObject[0]);

                var ips = Dns.GetHostAddresses(args[0].ToString(vm, args[0], location).String);

                foreach (var ip in ips)
                {
                    HassiumList.add(vm, list, location, HassiumIPAddr.IPAddrTypeDef._new(vm, null, location, new HassiumString(ip.ToString())));
                }

                return(list);
            }
Beispiel #12
0
            public static HassiumList hash(VirtualMachine vm, HassiumObject self, SourceLocation location, HassiumObject[] args)
            {
                HassiumList list = args[1].ToList(vm, args[1], location);

                byte[] bytes = new byte[list.Values.Count];
                for (int i = 0; i < bytes.Length; i++)
                {
                    bytes[i] = (byte)list.Values[i].ToChar(vm, list.Values[i], location).Char;
                }

                byte[] hash = ((HashAlgorithm)CryptoConfig.CreateFromName(args[0].ToString(vm, args[0], location).String.ToUpper())).ComputeHash(bytes);
                return(new HassiumByteArray(hash, new HassiumObject[0]));
            }
Beispiel #13
0
            public HassiumList gethosts(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                HassiumList list = new HassiumList(new HassiumObject[0]);

                var hosts = Dns.GetHostAddresses(args[0].ToString(vm, args[0], location).String);

                foreach (var host in hosts)
                {
                    HassiumList.add(vm, list, location, new HassiumString(host.ToString()));
                }

                return(list);
            }
Beispiel #14
0
        public static HassiumList range(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
        {
            int lower = args.Length == 1 ? 0 : (int)args[0].ToInt(vm, args[0], location).Int;
            int upper = args.Length == 1 ? (int)args[0].ToInt(vm, args[0], location).Int : (int)args[1].ToInt(vm, args[1], location).Int;

            HassiumList list = new HassiumList(new HassiumObject[0]);

            while (lower < upper)
            {
                HassiumList.add(vm, list, location, new HassiumInt(lower++));
            }

            return(list);
        }
Beispiel #15
0
            public static HassiumList match(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                Match match = Regex.Match(args[1].ToString(vm, args[1], location).String, args[0].ToString(vm, args[0], location).String);

                HassiumList list = new HassiumList(new HassiumObject[0]);

                while (match.Success)
                {
                    HassiumList.ListTypeDef.add(vm, list, location, new HassiumString(match.Value));
                    match = match.NextMatch();
                }

                return(list);
            }
Beispiel #16
0
            public static HassiumList randbytes(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                var         Random = (self as HassiumRandom).Random;
                HassiumList bytes  = new HassiumList(new HassiumObject[0]);

                int count = (int)args[0].ToInt(vm, args[0], location).Int;

                for (int i = 0; i < count; i++)
                {
                    byte[] buf = new byte[1];
                    Random.NextBytes(buf);
                    HassiumList.add(vm, bytes, location, new HassiumChar((char)buf[0]));
                }

                return(bytes);
            }
Beispiel #17
0
            public HassiumObject readbytes(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                var socket = (self as HassiumSocket);

                if (socket.Closed)
                {
                    vm.RaiseException(HassiumSocketClosedException.SocketClosedExceptionTypeDef._new(vm, null, location, this));
                    return(Null);
                }

                HassiumByteArray list = new HassiumByteArray(new byte[0], new HassiumObject[0]);
                int count             = (int)args[0].ToInt(vm, args[0], location).Int;

                for (int i = 0; i < count; i++)
                {
                    HassiumList.add(vm, list, location, new HassiumChar((char)socket.Reader.ReadBytes(1)[0]));
                }

                return(list);
            }
Beispiel #18
0
            public HassiumList readlines(VirtualMachine vm, HassiumObject self, SourceLocation location, params HassiumObject[] args)
            {
                HassiumList list = new HassiumList(new HassiumObject[0]);

                var stream = new FileStream(args[0].ToString(vm, args[0], location).String, FileMode.Open, FileAccess.Read, FileShare.Read);
                var reader = new StreamReader(stream);

                try
                {
                    while (reader.BaseStream.Position < reader.BaseStream.Length)
                    {
                        HassiumList.add(vm, list, location, new HassiumString(reader.ReadLine()));
                    }

                    return(list);
                }
                finally
                {
                    reader.Close();
                }
            }
Beispiel #19
0
        public override HassiumObject Invoke(VirtualMachine vm, SourceLocation location, params HassiumObject[] args)
        {
            if (SourceRepresentation != string.Empty)
            {
                vm.PushCallStack(string.Format("{0}\t[{1}]", SourceRepresentation, location));
            }
            if (SourceRepresentation != string.Empty || Name == "__init__")
            {
                vm.StackFrame.PushFrame();
            }

            int i = 0;

            foreach (var param in Parameters)
            {
                // If there's more arguments provided than called for
                if (i >= args.Length)
                {
                    vm.RaiseException(HassiumArgLengthException.ArgLengthExceptionTypeDef._new(vm, null, location, this, new HassiumInt(Parameters.Count), new HassiumInt(args.Length)));
                    return(Null);
                }

                var arg = args[i++];
                if (param.Key.FunctionParameterType == FunctionParameterType.Variadic)
                {
                    if (arg is HassiumList || arg is HassiumTuple)
                    {
                        vm.StackFrame.Add(param.Value, arg);
                    }
                    else
                    {
                        HassiumList list = new HassiumList(new HassiumObject[0]);
                        for (--i; i < args.Length; i++)
                        {
                            HassiumList.add(vm, list, location, args[i]);
                        }
                        vm.StackFrame.Add(param.Value, list);
                    }
                    break;
                }
                else if (param.Key.FunctionParameterType == FunctionParameterType.Enforced)
                {
                    var enforcedType = vm.ExecuteMethod(param.Key.EnforcedType);
                    if (enforcedType is HassiumTrait)
                    {
                        if (!(enforcedType as HassiumTrait).Is(vm, location, arg).Bool)
                        {
                            vm.RaiseException(HassiumConversionFailedException.ConversionFailedExceptionTypeDef._new(vm, null, location, arg, enforcedType));
                            return(Null);
                        }
                    }
                    else if (!arg.Types.Contains(enforcedType))
                    {
                        vm.RaiseException(HassiumConversionFailedException.ConversionFailedExceptionTypeDef._new(vm, null, location, arg, enforcedType));
                        return(Null);
                    }
                }
                vm.StackFrame.Add(param.Value, arg);
            }

            // If there's less arguments than called for
            if (i < args.Length)
            {
                vm.RaiseException(HassiumArgLengthException.ArgLengthExceptionTypeDef._new(vm, null, location, this, new HassiumInt(Parameters.Count), new HassiumInt(args.Length)));
                return(Null);
            }

            if (IsConstructor)
            {
                HassiumClass clazz = new HassiumClass((Parent as HassiumClass).Name);
                clazz.BoundAttributes = CloneDictionary(Parent.BoundAttributes);
                var parent = (Parent as HassiumClass);
                clazz.DocStr = parent.DocStr;
                clazz.AddType(parent.TypeDefinition);

                foreach (var inherit in parent.Inherits)
                {
                    foreach (var attrib in CloneDictionary(vm.ExecuteMethod(inherit).GetAttributes()))
                    {
                        if (!clazz.ContainsAttribute(attrib.Key))
                        {
                            attrib.Value.Parent = clazz;
                            clazz.BoundAttributes.Add(attrib.Key, attrib.Value);
                        }
                    }
                }

                foreach (var type in Parent.Types)
                {
                    clazz.AddType(type as HassiumTypeDefinition);
                }
                foreach (var attrib in clazz.BoundAttributes.Values)
                {
                    attrib.Parent = clazz;
                }
                vm.ExecuteMethod(clazz.BoundAttributes["new"] as HassiumMethod);
                vm.PopCallStack();
                vm.StackFrame.PopFrame();
                return(clazz);
            }

            var ret = vm.ExecuteMethod(this);

            if (ReturnType != null)
            {
                var enforcedType = vm.ExecuteMethod(ReturnType);
                enforcedType = enforcedType is HassiumTypeDefinition ? enforcedType : enforcedType.Type();
                if (!ret.Types.Contains(enforcedType))
                {
                    vm.RaiseException(HassiumConversionFailedException.ConversionFailedExceptionTypeDef._new(vm, null, location, ret, enforcedType));
                    return(this);
                }
            }

            if (Name != "__init__" && Name != string.Empty)
            {
                vm.StackFrame.PopFrame();
            }
            if (SourceRepresentation != string.Empty && Name != "__init__")
            {
                vm.PopCallStack();
            }
            return(ret);
        }
Beispiel #20
0
        public static void ExecuteConfig(HassiumConfig config)
        {
            if (config.HassiumRunType == HassiumRunType.Code)
            {
                try
                {
                    VirtualMachine vm     = new VirtualMachine();
                    var            module = HassiumCompiler.CompileModuleFromFilePath(System.IO.Path.GetFullPath(config.FilePath), config.SuppressWarnings);
                    HassiumList    hargs  = new HassiumList(new HassiumObject[0]);

                    foreach (var arg in config.Args)
                    {
                        hargs.Values.Add(new HassiumString(arg));
                    }

                    vm.Execute(module, hargs);
                }
                catch (CompilerException ex)
                {
                    Console.WriteLine(ex.Message);
                    if (config.Dev)
                    {
                        Console.WriteLine(ex);
                    }
                }
                catch (ParserException ex)
                {
                    Console.WriteLine(ex.Message);
                    if (config.Dev)
                    {
                        Console.WriteLine(ex);
                    }
                }
                catch (ScannerException ex)
                {
                    Console.WriteLine(ex.Message);
                    if (config.Dev)
                    {
                        Console.WriteLine(ex);
                    }
                }
                catch (UnhandledException ex)
                {
                    Console.WriteLine("Unhandled Exception:");
                    Console.WriteLine(ex.Message);
                    Console.WriteLine("\nNear:");
                    ex.SourceLocation.PrintLocation();
                    Console.WriteLine(ex.CallStack);
                    Environment.Exit(0);
                }
            }
            else if (config.HassiumRunType == HassiumRunType.PackageManager)
            {
                var mgr = new HassiumPackageManager();

                bool status;
                switch (config.Action.ToLower())
                {
                case "check":
                    status = mgr.CheckInstalled(config.Package);
                    if (status)
                    {
                        Console.WriteLine("Package '{0}' is installed! Remove it using Hassium.exe --pkg uninstall [PKGNAME]", config.Package);
                    }
                    else
                    {
                        Console.WriteLine("Package '{0}' is not installed! Install it using Hassium.exe --pkg install [PKGNAME]", config.Package);
                    }
                    break;

                case "install":
                    status = mgr.InstallPackage(config.Package);
                    if (status)
                    {
                        Console.WriteLine("Successfully installed '{0}'. Include ```use * from {0}/<mod>``` to use.", config.Package);
                    }
                    else
                    {
                        Console.WriteLine("Installation failed! Is the package name correct?");
                    }
                    break;

                case "uninstall":
                    status = mgr.UninstallPackage(config.Package);
                    if (status)
                    {
                        Console.WriteLine("Successfully uninstalled '{0}'.", config.Package);
                    }
                    else
                    {
                        Console.WriteLine("Uninstall failed! Is the package already uninstalled?");
                    }
                    break;
                }
            }
            else if (config.HassiumRunType == HassiumRunType.REPL)
            {
                HassiumREPL.Run(config);
            }
        }
Beispiel #21
0
        public static byte[] ListToByteArr(VirtualMachine vm, SourceLocation location, HassiumList list)
        {
            if (list is HassiumByteArray)
            {
                return((list as HassiumByteArray).Values.ToArray());
            }
            byte[] bytes = new byte[list.Values.Count];

            for (int i = 0; i < bytes.Length; i++)
            {
                bytes[i] = (byte)list.Values[i].ToChar(vm, list.Values[i], location).Char;
            }

            return(bytes);
        }