private IodineObject Invoke(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length <= 1)
            {
                vm.RaiseException(new IodineArgumentException(2));
                return(IodineNull.Instance);
            }

            IodineDictionary hash    = args [1] as IodineDictionary;
            IodineContext    context = new IodineContext();

            context.Globals.Clear();

            foreach (IodineObject key in hash.Keys)
            {
                context.Globals [key.ToString()] = hash.Get(key);
                args [0].SetAttribute(key.ToString(), hash.Get(key));
            }

            VirtualMachine newVm = new VirtualMachine(context);

            try {
                return(args [0].Invoke(newVm, new IodineObject[] { }));
            } catch (SyntaxException syntaxException) {
                vm.RaiseException(new IodineSyntaxException(syntaxException.ErrorLog));
                return(IodineNull.Instance);
            } catch (UnhandledIodineExceptionException ex) {
                vm.RaiseException(ex.OriginalException);
                return(IodineNull.Instance);
            }
        }
        private IodineObject Eval(VirtualMachine host, string source, IodineDictionary dict)
        {
            VirtualMachine vm = host;

            IodineContext context = host.Context;

            if (dict != null)
            {
                context = new IodineContext();
                context.Globals.Clear();

                vm = new VirtualMachine(host.Context);

                foreach (IodineObject key in dict.Keys)
                {
                    context.Globals [key.ToString()] = dict.Get(key);
                }
            }

            SourceUnit   code   = SourceUnit.CreateFromSource(source);
            IodineModule module = null;

            try {
                module = code.Compile(context);
            } catch (SyntaxException ex) {
                vm.RaiseException(new IodineSyntaxException(ex.ErrorLog));
                return(IodineNull.Instance);
            }
            return(module.Invoke(vm, new IodineObject[] { }));
        }
Esempio n. 3
0
        public IodineObject Set(VirtualMachine vm, IodineObject obj)
        {
            IodineDictionary dict = obj as IodineDictionary;

            if (dict != null)
            {
                vm.Context.Globals.Clear();
                Console.WriteLine("Set.");
                foreach (IodineObject key in dict.Keys)
                {
                    vm.Context.Globals [key.ToString()] = dict.Get(key);
                }
            }
            return(null);
        }
            public override IodineObject Invoke(VirtualMachine vm, IodineObject[] args)
            {
                if (args.Length == 0)
                {
                    vm.RaiseException(new IodineArgumentException(1));
                    return(null);
                }

                IodineString name = args [0] as IodineString;

                if (name == null)
                {
                    vm.RaiseException(new IodineTypeException("Str"));
                    return(null);
                }

                IodineTypeDefinition baseType = IodineObject.ObjectTypeDef;

                if (args.Length > 1)
                {
                    baseType = args [1] as IodineTypeDefinition;

                    if (baseType == null)
                    {
                        vm.RaiseException(new IodineTypeException("TypeDef"));
                        return(null);
                    }
                }

                IodineTypeDefinition clazz = new IodineTypeDefinition(name.Value);

                clazz.Base = baseType;

                if (args.Length > 2)
                {
                    IodineDictionary map = args [2] as IodineDictionary;

                    foreach (IodineObject key in map.Keys)
                    {
                        clazz.SetAttribute(key.ToString(), map.Get(key));
                    }
                }

                return(clazz);
            }