@@ -120,7 +120,7 @@ public override IeJsValue MapToScriptType(object value)
120120 public override object MapToHostType ( IeJsValue value )
121121 {
122122 JsValueType valueType = value . ValueType ;
123- object result ;
123+ object result = null ;
124124
125125 switch ( valueType )
126126 {
@@ -139,8 +139,23 @@ public override object MapToHostType(IeJsValue value)
139139 case JsValueType . String :
140140 result = value . ToString ( ) ;
141141 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
142155 case JsValueType . Object :
156+ #if ! NETSTANDARD
143157 case JsValueType . Function:
158+ #endif
144159 case JsValueType . Error :
145160 case JsValueType . Array :
146161#if NETSTANDARD
@@ -222,10 +237,10 @@ private IeEmbeddedObject CreateEmbeddedFunction(Delegate del)
222237
223238 GCHandle delHandle = GCHandle . Alloc ( del ) ;
224239 IntPtr delPtr = GCHandle . ToIntPtr ( delHandle ) ;
225- IeJsValue prototypeValue = IeJsValue . CreateExternalObject ( delPtr , _embeddedObjectFinalizeCallback ) ;
240+ IeJsValue objValue = IeJsValue . CreateExternalObject ( delPtr , _embeddedObjectFinalizeCallback ) ;
226241
227242 IeJsValue functionValue = IeJsValue . CreateFunction ( nativeFunction ) ;
228- functionValue . Prototype = prototypeValue ;
243+ SetNonEnumerableProperty ( functionValue , ExternalObjectPropertyName , objValue ) ;
229244
230245 var embeddedObject = new IeEmbeddedObject ( del , functionValue ,
231246 new List < IeJsNativeFunction > { nativeFunction } ) ;
@@ -297,14 +312,13 @@ protected override IeEmbeddedType CreateEmbeddedType(Type type)
297312 return resultValue ;
298313 } ;
299314
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 ,
304318 _embeddedTypeFinalizeCallback ) ;
305319
306320 IeJsValue typeValue = IeJsValue . CreateFunction ( nativeConstructorFunction ) ;
307- typeValue . Prototype = prototypeValue ;
321+ SetNonEnumerableProperty ( typeValue , ExternalObjectPropertyName , objValue ) ;
308322
309323 var embeddedType = new IeEmbeddedType ( type , typeValue ,
310324 new List < IeJsNativeFunction > { nativeConstructorFunction } ) ;
@@ -621,13 +635,25 @@ private void ProjectMethods(IeEmbeddedItem externalItem)
621635 }
622636
623637 [ MethodImpl ( ( MethodImplOptions ) 256 /* AggressiveInlining */ ) ]
624- private void FreezeObject ( IeJsValue objValue )
638+ private static void FreezeObject ( IeJsValue objValue )
625639 {
626640 IeJsValue objectValue = IeJsValue . GlobalObject . GetProperty ( "Object" ) ;
627641 IeJsValue freezeMethodValue = objectValue . GetProperty ( "freeze" ) ;
628642
629643 freezeMethodValue . CallFunction ( objectValue , objValue ) ;
630644 }
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+ }
631657#endif
632658 }
633659}
0 commit comments