예제 #1
0
        public JSBool DefaultConstructor(JSContextPtr context, uint argc, JSCallArgumentsPtr vp)
        {
            // We have to invoke NewObjectForConstructor in order to construct a this-reference
            //  that has our class's prototype and .constructor values.
            var @this = NewObjectForConstructor(argc, vp);

            vp.Result = @this;
            return(true);
        }
예제 #2
0
        /// <summary>
        /// Creates a this-reference for use inside this class's constructor.
        /// </summary>
        public JS.Value NewObjectForConstructor(uint argc, JSCallArgumentsPtr vp)
        {
            var callArgs = new JSCallArgs(vp, argc);

            return(new JS.Value(
                       JSAPI.NewObjectForConstructor(
                           Context, ClassPtr, ref callArgs
                           )
                       ));
        }
        // Bound via reflection
        private JSBool Invoke(JSContextPtr cx, uint argc, JSCallArgumentsPtr args)
        {
            // TODO: Marshal params arrays
            var managedArgs = new object[ArgumentCount];

            for (uint i = 0, l = Math.Min(ArgumentCount, argc); i < l; i++)
            {
                try {
                    managedArgs[i] = JSMarshal.NativeToManaged(cx, args[i]);
                } catch (Exception exc) {
                    var wrapped = new Exception(
                        "Argument #" + i + " could not be converted",
                        exc
                        );

                    JSMarshal.Throw(cx, wrapped);
                    return(false);
                }
            }

            object managedResult;

            try {
                managedResult = ManagedMethod.DynamicInvoke(managedArgs);
            } catch (Exception exc) {
                JSMarshal.Throw(cx, exc);
                return(false);
            }

            if (
                (ManagedMethod.Method.ReturnType == null) ||
                (ManagedMethod.Method.ReturnType.FullName == "System.Void")
                )
            {
                args.Result = JS.Value.Undefined;
                return(true);
            }

            JS.Value nativeResult;
            try {
                nativeResult = JSMarshal.ManagedToNative(cx, managedResult);
            } catch (Exception exc) {
                var wrapped = new Exception(
                    "Return value could not be converted",
                    exc
                    );

                JSMarshal.Throw(cx, wrapped);
                return(false);
            }

            args.Result = nativeResult;
            return(true);
        }
예제 #4
0
        public static JSBool TestNative(JSContextPtr cx, uint argc, JSCallArgumentsPtr vp)
        {
            if (argc < 1)
            {
                return(false);
            }

            var n = vp[0];

            vp.Result = new JS.Value((int)n * 2);
            return(true);
        }
예제 #5
0
 public static bool TestNativeConstructor(JSContextPtr cx, uint argc, JSCallArgumentsPtr vp)
 {
     return(true);
 }