@@ -120,7 +120,7 @@ public override IeJsValue MapToScriptType(object value)
120
120
public override object MapToHostType ( IeJsValue value )
121
121
{
122
122
JsValueType valueType = value . ValueType ;
123
- object result ;
123
+ object result = null ;
124
124
125
125
switch ( valueType )
126
126
{
@@ -139,8 +139,23 @@ public override object MapToHostType(IeJsValue value)
139
139
case JsValueType . String :
140
140
result = value . ToString ( ) ;
141
141
break ;
142
+ #if NETSTANDARD
143
+ case JsValueType . Function:
144
+ IeJsPropertyId externalObjectPropertyId = IeJsPropertyId . FromString ( ExternalObjectPropertyName ) ;
145
+ if ( value . HasProperty ( externalObjectPropertyId ) )
146
+ {
147
+ IeJsValue externalObjectValue = value . GetProperty ( externalObjectPropertyId ) ;
148
+ result = externalObjectValue . HasExternalData ?
149
+ GCHandle . FromIntPtr ( externalObjectValue . ExternalData ) . Target : null ;
150
+ }
151
+
152
+ result = result ?? value . ConvertToObject ( ) ;
153
+ break ;
154
+ #endif
142
155
case JsValueType . Object :
156
+ #if ! NETSTANDARD
143
157
case JsValueType . Function:
158
+ #endif
144
159
case JsValueType . Error :
145
160
case JsValueType . Array :
146
161
#if NETSTANDARD
@@ -222,10 +237,10 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del)
222
237
223
238
GCHandle delHandle = GCHandle . Alloc ( del ) ;
224
239
IntPtr delPtr = GCHandle . ToIntPtr ( delHandle ) ;
225
- IeJsValue prototypeValue = IeJsValue . CreateExternalObject ( delPtr , _embeddedObjectFinalizeCallback ) ;
240
+ IeJsValue objValue = IeJsValue . CreateExternalObject ( delPtr , _embeddedObjectFinalizeCallback ) ;
226
241
227
242
IeJsValue functionValue = IeJsValue . CreateFunction ( nativeFunction ) ;
228
- functionValue . Prototype = prototypeValue ;
243
+ SetNonEnumerableProperty ( functionValue , ExternalObjectPropertyName , objValue ) ;
229
244
230
245
var embeddedObject = new IeEmbeddedObject ( del , functionValue ,
231
246
new List < IeJsNativeFunction > { nativeFunction } ) ;
@@ -297,14 +312,13 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type)
297
312
return resultValue ;
298
313
} ;
299
314
300
- string embeddedTypeKey = type . AssemblyQualifiedName ;
301
- GCHandle embeddedTypeKeyHandle = GCHandle . Alloc ( embeddedTypeKey ) ;
302
- IntPtr embeddedTypeKeyPtr = GCHandle . ToIntPtr ( embeddedTypeKeyHandle ) ;
303
- IeJsValue prototypeValue = IeJsValue . CreateExternalObject ( embeddedTypeKeyPtr ,
315
+ GCHandle embeddedTypeHandle = GCHandle . Alloc ( type ) ;
316
+ IntPtr embeddedTypePtr = GCHandle . ToIntPtr ( embeddedTypeHandle ) ;
317
+ IeJsValue objValue = IeJsValue . CreateExternalObject ( embeddedTypePtr ,
304
318
_embeddedTypeFinalizeCallback ) ;
305
319
306
320
IeJsValue typeValue = IeJsValue . CreateFunction ( nativeConstructorFunction ) ;
307
- typeValue . Prototype = prototypeValue ;
321
+ SetNonEnumerableProperty ( typeValue , ExternalObjectPropertyName , objValue ) ;
308
322
309
323
var embeddedType = new IeEmbeddedType ( type , typeValue ,
310
324
new List < IeJsNativeFunction > { nativeConstructorFunction } ) ;
@@ -621,13 +635,25 @@ private void ProjectMethods(IeEmbeddedItem externalItem)
621
635
}
622
636
623
637
[ MethodImpl ( ( MethodImplOptions ) 256 /* AggressiveInlining */ ) ]
624
- private void FreezeObject ( IeJsValue objValue )
638
+ private static void FreezeObject ( IeJsValue objValue )
625
639
{
626
640
IeJsValue objectValue = IeJsValue . GlobalObject . GetProperty ( "Object" ) ;
627
641
IeJsValue freezeMethodValue = objectValue . GetProperty ( "freeze" ) ;
628
642
629
643
freezeMethodValue . CallFunction ( objectValue , objValue ) ;
630
644
}
645
+
646
+ [ MethodImpl ( ( MethodImplOptions ) 256 /* AggressiveInlining */ ) ]
647
+ private static void SetNonEnumerableProperty ( IeJsValue objValue , string name , IeJsValue value )
648
+ {
649
+ IeJsValue descriptorValue = IeJsValue . CreateObject ( ) ;
650
+ descriptorValue . SetProperty ( "enumerable" , IeJsValue . False , true ) ;
651
+ descriptorValue . SetProperty ( "writable" , IeJsValue . True , true ) ;
652
+
653
+ IeJsPropertyId id = IeJsPropertyId . FromString ( name ) ;
654
+ objValue . DefineProperty ( id , descriptorValue ) ;
655
+ objValue . SetProperty ( id , value , true ) ;
656
+ }
631
657
#endif
632
658
}
633
659
}
0 commit comments