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); }
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)); }
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); }
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); }
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); }