示例#1
0
        internal object GetExternalObjectFrom(JavaScriptValue value)
        {
            Debug.Assert(value != null);
            IntPtr handlePtr;
            var    r = api_.JsGetExternalData(value.handle_, out handlePtr);

            if (r == JsErrorCode.JsErrorInvalidArgument)
            {
                return(null);
            }
            Errors.ThrowIfIs(r);
            GCHandle gcHandle             = GCHandle.FromIntPtr(handlePtr);
            ExternalObjectThunkData thunk = gcHandle.Target as ExternalObjectThunkData;

            if (thunk == null)
            {
                return(null);
            }
            if (thunk.userDataStrong != null)
            {
                return(thunk.userDataStrong);
            }
            object result;

            thunk.userData.TryGetTarget(out result);
            return(result);
        }
示例#2
0
        public JavaScriptObject CreateExternalObject(object externalData, JavaScriptExternalObjectFinalizeCallback finalizeCallback)
        {
            ExternalObjectThunkData thunk = new ExternalObjectThunkData()
            {
                callback = finalizeCallback, engine = new WeakReference <JavaScriptEngine>(this), userData = new WeakReference <object>(externalData),
            };
            GCHandle handle = GCHandle.Alloc(thunk);

            externalObjects_.Add(thunk);

            JavaScriptValueSafeHandle result;

            Errors.ThrowIfIs(api_.JsCreateExternalObject(GCHandle.ToIntPtr(handle), FinalizerCallbackPtr, out result));

            return(CreateObjectFromHandle(result));
        }
示例#3
0
        internal object GetExternalObjectFrom(JavaScriptValue value)
        {
            Debug.Assert(value != null);

            IntPtr handlePtr;

            Errors.ThrowIfIs(api_.JsGetExternalData(value.handle_, out handlePtr));
            GCHandle gcHandle             = GCHandle.FromIntPtr(handlePtr);
            ExternalObjectThunkData thunk = gcHandle.Target as ExternalObjectThunkData;

            if (thunk == null)
            {
                return(null);
            }

            object result;

            thunk.userData.TryGetTarget(out result);
            return(result);
        }
示例#4
0
        public JavaScriptObject CreateExternalObject(object externalData, JavaScriptExternalObjectFinalizeCallback finalizeCallback)
        {
            if (externalObjectsDict.TryGetValue(externalData, out var obj))
            {
                return(obj);
            }

            ExternalObjectThunkData thunk = new ExternalObjectThunkData()
            {
                callback = finalizeCallback, engine = engineWeakReference, userDataStrong = externalData, order = ++lastExternalObjectId                                                             /*, userData = new WeakReferenceStruct<object>(externalData),*/
            };
            GCHandle handle = GCHandle.Alloc(thunk);

            strongGCHandles.Add(handle);
            externalObjects_.Add(thunk);

            JavaScriptValueSafeHandle result;

            Errors.ThrowIfIs(api_.JsCreateExternalObject(GCHandle.ToIntPtr(handle), FinalizerCallbackPtr, out result));

            obj = CreateObjectFromHandle(result);
            externalObjectsDict.Add(externalData, obj);
            return(obj);
        }
示例#5
0
        public JavaScriptObject CreateExternalObject(object externalData, JavaScriptExternalObjectFinalizeCallback finalizeCallback)
        {
            ExternalObjectThunkData thunk = new ExternalObjectThunkData() { callback = finalizeCallback, engine = new WeakReference<JavaScriptEngine>(this), userData = new WeakReference<object>(externalData), };
            GCHandle handle = GCHandle.Alloc(thunk);
            externalObjects_.Add(thunk);

            ClaimContext();
            JavaScriptValueSafeHandle result;
            Errors.ThrowIfIs(api_.JsCreateExternalObject(GCHandle.ToIntPtr(handle), NativeCallbackPtr, out result));

            return CreateObjectFromHandle(result);
        }