예제 #1
0
        private IodineObject eval(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length <= 0)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(null);
            }

            IodineString  str = args [0] as IodineString;
            IodineHashMap map = null;

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

            if (args.Length >= 2)
            {
                map = args [1] as IodineHashMap;
                if (map == null)
                {
                    vm.RaiseException(new IodineTypeException("HashMap"));
                    return(null);
                }
            }

            return(eval(vm, str.ToString(), map));
        }
예제 #2
0
        /**
         * Iodine Function: _warn (type, msg)
         * Description: Internal low level function for issuing warnings
         * See modules/warnings.id
         */
        private IodineObject Warn(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length <= 1)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(null);
            }

            IodineInteger warnType = args [0] as IodineInteger;
            IodineString  warnMsg  = args [1] as IodineString;

            if (warnType == null)
            {
                vm.RaiseException(new IodineTypeException("Int"));
                return(null);
            }

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

            vm.Context.Warn((WarningType)warnType.Value, warnMsg.ToString());
            return(null);
        }
예제 #3
0
        private IodineObject Eval(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length <= 0)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(IodineNull.Instance);
            }

            IodineString     str = args [0] as IodineString;
            IodineDictionary map = null;

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

            if (args.Length >= 2)
            {
                map = args [1] as IodineDictionary;
                if (map == null)
                {
                    vm.RaiseException(new IodineTypeException("Dict"));
                    return(IodineNull.Instance);
                }
            }

            return(Eval(vm, str.ToString(), map));
        }
예제 #4
0
            private IodineObject RightFind(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                IodineString thisObj = self as IodineString;

                if (args.Length < 1)
                {
                    vm.RaiseException(new IodineArgumentException(1));
                    return(null);
                }

                IodineString ch = args [0] as IodineString;

                if (ch == null)
                {
                    vm.RaiseException(new IodineTypeException("Str"));
                    return(null);
                }
                string val = ch.ToString();

                if (!thisObj.Value.Contains(val))
                {
                    return(new IodineInteger(-1));
                }
                return(new IodineInteger(thisObj.Value.LastIndexOf(val)));
            }
예제 #5
0
        private IodineObject LoadModule(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length < 1)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(IodineNull.Instance);
            }
            IodineString source = args [0] as IodineString;

            try {
                return(vm.LoadModule(source.ToString()));
            } catch (ModuleNotFoundException ex) {
                vm.RaiseException(new IodineModuleNotFoundException(ex.Name));
                return(null);
            }
        }
예제 #6
0
        public IodineMethod(
            IodineModule module,
            IodineString name,
            CodeObject bytecode,
            IodineTuple parameters,
            MethodFlags flags,
            IodineObject[] defaultValues,
            int defaultStart = 0
            )
            : base(MethodTypeDef)
        {
            Module                  = module;
            Bytecode                = bytecode;
            ParameterCount          = Parameters.Count;
            Variadic                = (flags & MethodFlags.AcceptsVarArgs) != 0;
            AcceptsKeywordArgs      = (flags & MethodFlags.AcceptsKwargs) != 0;
            HasDefaultValues        = (flags & MethodFlags.HasDefaultParameters) != 0;
            DefaultValuesStartIndex = defaultStart;
            DefaultValues           = defaultValues;
            SetParameters(Parameters, parameters);

            Name = name.ToString();

            SetAttribute("__doc__", IodineString.Empty);
            SetAttribute("__invoke__", new BuiltinMethodCallback(invoke, this));

            if (AcceptsKeywordArgs)
            {
                var lastParameter = Parameters.Last() as IodineNamedParameter;

                KwargsParameter = lastParameter.Name;

                if (Variadic)
                {
                    var secondToLastParameter = Parameters [Parameters.Count - 2] as
                                                IodineNamedParameter;

                    VarargsParameter = secondToLastParameter.Name;
                }
            }
            else if (Variadic)
            {
                var lastParameter = Parameters.Last() as IodineNamedParameter;
                VarargsParameter = lastParameter.Name;
            }
        }
예제 #7
0
            private IodineObject isMatch(VirtualMachine vm, IodineObject self, IodineObject[] args)
            {
                if (args.Length <= 0)
                {
                    vm.RaiseException(new IodineArgumentException(1));
                    return(null);
                }
                IodineString expr = args [0] as IodineString;

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

                return(IodineBool.Create(Value.IsMatch(expr.ToString())));
            }
예제 #8
0
        private IodineObject compile(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length <= 0)
            {
                vm.RaiseException(new IodineArgumentException(1));
                return(null);
            }
            IodineString expr = args [0] as IodineString;

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

            return(new IodineRegex(new Regex(expr.ToString())));
        }
예제 #9
0
        private IodineObject isMatch(VirtualMachine vm, IodineObject self, IodineObject[] args)
        {
            if (args.Length <= 1)
            {
                vm.RaiseException(new IodineArgumentException(2));
                return(null);
            }
            IodineString data    = args [0] as IodineString;
            IodineString pattern = args [1] as IodineString;

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

            return(IodineBool.Create(Regex.IsMatch(data.ToString(), pattern.ToString())));
        }
예제 #10
0
        private bool packObj(VirtualMachine vm, BinaryWriter bw, char type, int arg, IodineObject obj)
        {
            switch (type)
            {
            case '?':
            {
                IodineBool val = obj as IodineBool;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Bool"));
                    return(false);
                }
                else
                {
                    bw.Write(val.Value);
                }
                break;
            }

            case 'b':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((SByte)val.Value);
                }
                break;
            }

            case 'B':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((Byte)val.Value);
                }
                break;
            }

            case 'h':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((Int16)val.Value);
                }
                break;
            }

            case 'H':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((UInt16)val.Value);
                }
                break;
            }

            case 'l':
            case 'i':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((Int32)val.Value);
                }
                break;
            }

            case 'I':
            case 'L':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((UInt32)val.Value);
                }
                break;
            }

            case 'q':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write(val.Value);
                }
                break;
            }

            case 'Q':
            {
                IodineInteger val = obj as IodineInteger;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Int"));
                    return(false);
                }
                else
                {
                    bw.Write((UInt64)val.Value);
                }
                break;
            }

            case 'p':
            case 's':
            {
                IodineString val = obj as IodineString;
                if (val == null)
                {
                    vm.RaiseException(new IodineTypeException("Str"));
                    return(false);
                }
                else
                {
                    byte[] bytes = Encoding.ASCII.GetBytes(val.ToString());
                    for (int i = 0; i < arg; i++)
                    {
                        if (i < bytes.Length)
                        {
                            bw.Write(bytes [i]);
                        }
                        else
                        {
                            bw.Write((byte)0);
                        }
                    }
                }
                break;
            }
            }
            return(true);
        }