예제 #1
0
        private INativeFunction getNativeFunctionInterface(object @object, string name, int numberOfArguments)
        {
            INativeFunction nativeFunction = null;

            // movieplayer.play has as much as 10 parameters
            for (int args = numberOfArguments + 1; args < 12; args++)
            {
                Type[] arguments = new Type[args];
                for (int i = 0; i < arguments.Length; i++)
                {
                    arguments[i] = typeof(VSMXBaseObject);
                }
                try
                {
                    Method method = @object.GetType().GetMethod(name, arguments);
                    nativeFunction = new NativeFunction(@object, method, args - 1);
                    break;
                }
                catch (SecurityException e)
                {
                    Console.WriteLine("getNativeFunction", e);
                }
                catch (NoSuchMethodException)
                {
                    // Ignore error
                }
            }

            if (nativeFunction == null && log.DebugEnabled)
            {
                Console.WriteLine(string.Format("Not finding native function {0}.{1}(args={2:D})", @object, name, numberOfArguments + 1));
            }

            return(nativeFunction);
        }
예제 #2
0
        public virtual INativeFunction getNativeFunction(VSMXNativeObject @object, string name, int numberOfArguments)
        {
            BaseNativeObject nativeObject   = @object.Object;
            INativeFunction  nativeFunction = getNativeFunctionInterface(nativeObject, name, numberOfArguments);

            return(nativeFunction);
        }
예제 #3
0
        public virtual VSMXFunction getFunction(int numberOfArguments, VSMXBaseObject[] arguments)
        {
            this.numberOfArguments = numberOfArguments;
            this.arguments         = arguments;
            thisObject             = @object.Value;

            if (@object.hasPropertyValue(name))
            {
                VSMXBaseObject function = @object.getPropertyValue(name).Value;
                if (function != null && function is VSMXFunction)
                {
                    return((VSMXFunction)function);
                }
            }

            if (@object is VSMXFunction && callName.Equals(name))
            {
                // The first argument of the "call()" function call is the "this" object.
                if (numberOfArguments > 0)
                {
                    this.numberOfArguments--;
                    if (arguments.Length > 0)
                    {
                        thisObject     = arguments[0];
                        this.arguments = new VSMXBaseObject[this.numberOfArguments];
                        Array.Copy(arguments, 1, this.arguments, 0, this.numberOfArguments);
                    }
                }

                return((VSMXFunction)@object);
            }

            INativeFunction nativeFunction = null;

            if (@object is VSMXNativeObject)
            {
                VSMXNativeObject nativeObject = (VSMXNativeObject)@object;
                nativeFunction = NativeFunctionFactory.Instance.getNativeFunction(nativeObject, name, numberOfArguments);
            }
            else if (@object is VSMXBaseObject)
            {
                nativeFunction = NativeFunctionFactory.Instance.getNativeFunction(@object, name, numberOfArguments);
            }

            if (nativeFunction != null)
            {
                return(new VSMXNativeFunction(interpreter, nativeFunction));
            }

            return(null);
        }
예제 #4
0
        protected internal virtual VSMXBaseObject getRef(int numberOfArguments)
        {
            if (string.ReferenceEquals(refProperty, null))
            {
                return(refObject.getPropertyValue(refIndex));
            }

            if (!refObject.hasPropertyValue(refProperty) && refObject is VSMXNativeObject)
            {
                VSMXNativeObject nativeObject   = (VSMXNativeObject)refObject;
                INativeFunction  nativeFunction = NativeFunctionFactory.Instance.getNativeFunction(nativeObject, refProperty, numberOfArguments);
                if (nativeFunction != null)
                {
                    return(new VSMXNativeFunction(interpreter, nativeFunction));
                }
            }

            return(refObject.getPropertyValue(refProperty));
        }
예제 #5
0
 public VSMXNativeFunction(VSMXInterpreter interpreter, INativeFunction nativeFunction) : base(interpreter, nativeFunction.Args, 0, -1)
 {
     this.nativeFunction = nativeFunction;
     arguments           = new VSMXBaseObject[nativeFunction.Args + 1];
 }