Пример #1
0
 public JsValueHolder(IContextSwitchService contextSwitch, JavaScriptValue value)
 {
     this.contextSwitch = contextSwitch;
     contextSwitch.With(() =>
     {
         value.AddRef();
     });
 }
Пример #2
0
 internal void SetJSSource(JavaScriptValue value, IContextSwitchService context)
 {
     if (JSSource.IsValid)
     {
         throw new InvalidOperationException("cannot set jsvalue twice");
     }
     if (!value.IsValid)
     {
         throw new ArgumentException("not a valid javascriptvalue", nameof(value));
     }
     value.AddRef();
     JSSource       = value;
     releaseJSValue = new Action(() => { context.With(() => value.Release()); });
 }
Пример #3
0
        public static JavaScriptValue CreateTypedArray(this IJSValueService valueService, JSTypedArray source, JavaScriptValue?arrayBufferSource)
        {
            IContextSwitchService switchService = valueService.CurrentNode.GetService <IRuntimeService>().InternalContextSwitchService;

            if (source.JSSource.IsValid)
            {
                return(source.JSSource);
            }
            switch (source.BufferSource)
            {
            case SharedBufferSourceEnum.CreateByDotnet:
                return(switchService.With <JavaScriptValue>(
                           () =>
                {
                    if (arrayBufferSource == null)
                    {
                        throw new ArgumentNullException(nameof(arrayBufferSource));
                    }
                    var result = JavaScriptValue.CreateTypedArray(source.ArrayType, arrayBufferSource.Value, source.Position, source.UnitCount);
                    source.SetJSSource(result, switchService);
                    return result;
                }
                           ));

            case SharedBufferSourceEnum.CreateByJavascript:
                throw new InvalidOperationException("invalid source typed array");    //create by javascript should already have JavaScriptValue assigned

            case SharedBufferSourceEnum.CreateInJavascript:
                return(switchService.With <JavaScriptValue>(
                           () =>
                {
                    var result = JavaScriptValue.CreateTypedArray(source.ArrayType, JavaScriptValue.Invalid, source.Position, source.UnitCount);
                    source.SetJSSource(result, switchService);        //hold the objec
                    //get the internal storage
                    JavaScriptValue.GetTypedArrayStorage(result, out IntPtr data, out uint bufferLength, out JavaScriptTypedArrayType type, out int elementSize);
                    source.InitWindow(data, false);
                    source.InitBeforeConvert(source.Buffer);
                    return result;
                }
                           ));

            case SharedBufferSourceEnum.CreateByExternal:
                throw new ArgumentException("TypedArray does not support create from external");

            default:
                throw new ArgumentOutOfRangeException("Invalid BufferSource property in JSTypedArray object");
            }
        }
Пример #4
0
        /// <summary>
        /// Create DataView in javascript
        /// this method requires a sourceArrayBuffer which make sure the arraybuffer is initialized before transfer to javascript
        /// </summary>
        /// <param name="sourceArrayBuffer">ArrayBuffer object</param>
        /// <param name="source"></param>
        /// <returns></returns>
        public static JavaScriptValue CreateDataView(this IJSValueService valueService, JavaScriptValue sourceArrayBuffer, JSDataView source)
        {
            IContextSwitchService switchService = valueService.CurrentNode.GetService <IRuntimeService>().InternalContextSwitchService;

            if (source.JSSource.IsValid)
            {
                return(source.JSSource);
            }
            switch (source.BufferSource)
            {
            case SharedBufferSourceEnum.CreateByDotnet:
                return(switchService.With <JavaScriptValue>(
                           () =>
                {
                    var result = JavaScriptValue.CreateDataView(sourceArrayBuffer, source.Position, (uint)source.Size);
                    source.SetJSSource(result, switchService);
                    source.InitBeforeConvert(source.Buffer);
                    return result;
                }
                           ));

            case SharedBufferSourceEnum.CreateByJavascript:
                throw new InvalidOperationException("invalid source typed array");    //create by javascript should already have JavaScriptValue assigned

            case SharedBufferSourceEnum.CreateInJavascript:
                return(switchService.With <JavaScriptValue>(
                           () =>
                {
                    var result = JavaScriptValue.CreateDataView(sourceArrayBuffer, source.Position, (uint)source.Size);
                    source.SetJSSource(result, switchService);
                    JavaScriptValue.GetDataViewStorage(result, out IntPtr data, out uint bufferLength);
                    source.InitWindow(data, false);
                    source.InitBeforeConvert(source.Buffer);
                    return result;
                }
                           ));

            case SharedBufferSourceEnum.CreateByExternal:
                throw new ArgumentException("DataView does not support create from external");

            default:
                throw new ArgumentOutOfRangeException("Invalid BufferSource property in JSDataView object");
            }
        }
Пример #5
0
        public static JavaScriptValue CreateArrayBuffer(this IJSValueService valueService, JSArrayBuffer source)
        {
            IContextSwitchService switchService = valueService.CurrentNode.GetService <IRuntimeService>().InternalContextSwitchService;

            return(switchService.With <JavaScriptValue>(() =>
            {
                if (source.JSSource.IsValid)
                {
                    return source.JSSource;
                }
                switch (source.BufferSource)
                {
                case SharedBufferSourceEnum.CreateByJavascript:
                    throw new InvalidOperationException("invalid source array buffer");    //create by javascript should already have JavaScriptValue assigned

                case SharedBufferSourceEnum.CreateInJavascript:
                    {
                        JavaScriptValue result = JavaScriptValue.CreateArrayBuffer((uint)source.Size);
                        source.SetJSSource(result, switchService);    //hold the varient
                        var data = JavaScriptValue.GetArrayBufferStorage(result, out uint bufferSize);
                        source.InitWindow(data, false);
                        source.InitBeforeConvert(source.Buffer);
                        return result;
                    }

                case SharedBufferSourceEnum.CreateByDotnet:
                case SharedBufferSourceEnum.CreateByExternal:
                    {
                        var result = JavaScriptValue.CreateExternalArrayBuffer(source.Buffer.Handle, (uint)source.Buffer.ByteLength, null, IntPtr.Zero); //do not handle GC callback, user should control the varient life cycle
                        source.SetJSSource(result, switchService);                                                                                       //hold the varient
                        return result;
                    }

                default:
                    throw new ArgumentOutOfRangeException("Invalid BufferSource property in JSArryBuffer object");
                }
            }
                                                        ));
        }
Пример #6
0
        internal static JSArrayBuffer CreateFromJS(IntPtr handle, uint size, JavaScriptValue value, IContextSwitchService context)
        {
            var result = new JSArrayBuffer(SharedBufferSourceEnum.CreateByJavascript, (ulong)size);

            result.SetJSSource(value, context);
            result.InitWindow(handle, false); //memory owned by js, do not release when object is disposed
            return(result);
        }
Пример #7
0
        internal static JSDataView CreateFromJS(JavaScriptValue value, IntPtr handle, uint size, IContextSwitchService context)
        {
            JSDataView result = new JSDataView(SharedBufferSourceEnum.CreateByJavascript, null, 0, size);

            result.SetJSSource(value, context);
            result.InitWindow(handle, false);
            return(result);
        }
Пример #8
0
        internal static JSTypedArray CreateFromJS(JavaScriptTypedArrayType type, IntPtr data, uint unitCount, JavaScriptValue source, IContextSwitchService context)
        {
            JSTypedArray result = new JSTypedArray(type, 0, unitCount);

            result.SetJSSource(source, context);
            result.InitWindow(data, false);
            return(result);
        }
Пример #9
0
 public RuntimeService(JavaScriptRuntime runtime)
 {
     this.runtime = runtime;
     context      = runtime.CreateContext();
     InternalContextSwitchService = new RuntimeInternalContextSwitcher(context);
 }