@@ -730,104 +730,6 @@ MethodDefinitionHandle EmitUcoMethod (UcoMethodData uco)
730730 return handle ;
731731 }
732732
733- void EmitRegisterNatives ( List < NativeRegistrationData > registrations , Dictionary < string , MethodDefinitionHandle > wrapperHandles )
734- {
735- var validRegs = new List < ( NativeRegistrationData Reg , MethodDefinitionHandle Wrapper ) > ( registrations . Count ) ;
736- foreach ( var reg in registrations ) {
737- if ( wrapperHandles . TryGetValue ( reg . WrapperMethodName , out var wrapperHandle ) ) {
738- validRegs . Add ( ( reg , wrapperHandle ) ) ;
739- }
740- }
741-
742- if ( validRegs . Count == 0 ) {
743- _pe . EmitBody ( "RegisterNatives" ,
744- MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
745- MethodAttributes . NewSlot | MethodAttributes . Final ,
746- sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
747- rt => rt . Void ( ) ,
748- p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
749- encoder => encoder . OpCode ( ILOpCode . Ret ) ) ;
750- return ;
751- }
752-
753- var nameFields = new FieldDefinitionHandle [ validRegs . Count ] ;
754- var sigFields = new FieldDefinitionHandle [ validRegs . Count ] ;
755- for ( int i = 0 ; i < validRegs . Count ; i ++ ) {
756- nameFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniMethodName ) ;
757- sigFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniSignature ) ;
758- }
759-
760- int methodCount = validRegs . Count ;
761-
762- _pe . EmitBody ( "RegisterNatives" ,
763- MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
764- MethodAttributes . NewSlot | MethodAttributes . Final ,
765- sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
766- rt => rt . Void ( ) ,
767- p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
768- encoder => {
769- encoder . LoadConstantI4 ( methodCount ) ;
770- encoder . OpCode ( ILOpCode . Sizeof ) ;
771- encoder . Token ( _jniNativeMethodRef ) ;
772- encoder . OpCode ( ILOpCode . Mul ) ;
773- encoder . OpCode ( ILOpCode . Localloc ) ;
774- encoder . StoreLocal ( 0 ) ;
775-
776- for ( int i = 0 ; i < methodCount ; i ++ ) {
777- encoder . LoadLocal ( 0 ) ;
778- if ( i > 0 ) {
779- encoder . LoadConstantI4 ( i ) ;
780- encoder . OpCode ( ILOpCode . Sizeof ) ;
781- encoder . Token ( _jniNativeMethodRef ) ;
782- encoder . OpCode ( ILOpCode . Mul ) ;
783- encoder . OpCode ( ILOpCode . Add ) ;
784- }
785-
786- encoder . OpCode ( ILOpCode . Ldsflda ) ;
787- encoder . Token ( nameFields [ i ] ) ;
788-
789- encoder . OpCode ( ILOpCode . Ldsflda ) ;
790- encoder . Token ( sigFields [ i ] ) ;
791-
792- encoder . OpCode ( ILOpCode . Ldftn ) ;
793- encoder . Token ( validRegs [ i ] . Wrapper ) ;
794-
795- encoder . OpCode ( ILOpCode . Newobj ) ;
796- encoder . Token ( _jniNativeMethodCtorRef ) ;
797- encoder . OpCode ( ILOpCode . Stobj ) ;
798- encoder . Token ( _jniNativeMethodRef ) ;
799- }
800-
801- encoder . LoadArgument ( 1 ) ;
802- encoder . OpCode ( ILOpCode . Callvirt ) ;
803- encoder . Token ( _jniTypePeerReferenceRef ) ;
804- encoder . StoreLocal ( 1 ) ;
805-
806- encoder . LoadLocalAddress ( 2 ) ;
807- encoder . LoadLocal ( 0 ) ;
808- encoder . LoadConstantI4 ( methodCount ) ;
809- encoder . Call ( _readOnlySpanOfJniNativeMethodCtorRef ) ;
810-
811- encoder . LoadLocal ( 1 ) ;
812- encoder . LoadLocal ( 2 ) ;
813- encoder . Call ( _jniEnvTypesRegisterNativesRef ) ;
814- encoder . OpCode ( ILOpCode . Ret ) ;
815- } ,
816- encodeLocals : localSig => {
817- localSig . WriteByte ( 0x07 ) ;
818- localSig . WriteCompressedInteger ( 3 ) ;
819- localSig . WriteByte ( 0x18 ) ;
820- localSig . WriteByte ( 0x11 ) ;
821- localSig . WriteCompressedInteger ( CodedIndex . TypeDefOrRefOrSpec ( _jniObjectReferenceRef ) ) ;
822- EncodeGenericValueTypeInst ( localSig , _readOnlySpanOpenRef , _jniNativeMethodRef ) ;
823- } ) ;
824- }
825-
826- void AddUnmanagedCallersOnlyAttribute ( MethodDefinitionHandle handle )
827- {
828- _pe . Metadata . AddCustomAttribute ( handle , _ucoAttrCtorRef , _ucoAttrBlobHandle ) ;
829- }
830-
831733 MethodDefinitionHandle EmitUcoConstructor ( UcoConstructorData uco , JavaPeerProxyData proxy )
832734 {
833735 var targetTypeRef = _pe . ResolveTypeRef ( uco . TargetType ) ;
@@ -943,6 +845,104 @@ MethodDefinitionHandle EmitUcoConstructor (UcoConstructorData uco, JavaPeerProxy
943845 return handle ;
944846 }
945847
848+ void EmitRegisterNatives ( List < NativeRegistrationData > registrations , Dictionary < string , MethodDefinitionHandle > wrapperHandles )
849+ {
850+ var validRegs = new List < ( NativeRegistrationData Reg , MethodDefinitionHandle Wrapper ) > ( registrations . Count ) ;
851+ foreach ( var reg in registrations ) {
852+ if ( wrapperHandles . TryGetValue ( reg . WrapperMethodName , out var wrapperHandle ) ) {
853+ validRegs . Add ( ( reg , wrapperHandle ) ) ;
854+ }
855+ }
856+
857+ if ( validRegs . Count == 0 ) {
858+ _pe . EmitBody ( "RegisterNatives" ,
859+ MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
860+ MethodAttributes . NewSlot | MethodAttributes . Final ,
861+ sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
862+ rt => rt . Void ( ) ,
863+ p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
864+ encoder => encoder . OpCode ( ILOpCode . Ret ) ) ;
865+ return ;
866+ }
867+
868+ var nameFields = new FieldDefinitionHandle [ validRegs . Count ] ;
869+ var sigFields = new FieldDefinitionHandle [ validRegs . Count ] ;
870+ for ( int i = 0 ; i < validRegs . Count ; i ++ ) {
871+ nameFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniMethodName ) ;
872+ sigFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniSignature ) ;
873+ }
874+
875+ int methodCount = validRegs . Count ;
876+
877+ _pe . EmitBody ( "RegisterNatives" ,
878+ MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
879+ MethodAttributes . NewSlot | MethodAttributes . Final ,
880+ sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
881+ rt => rt . Void ( ) ,
882+ p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
883+ encoder => {
884+ encoder . LoadConstantI4 ( methodCount ) ;
885+ encoder . OpCode ( ILOpCode . Sizeof ) ;
886+ encoder . Token ( _jniNativeMethodRef ) ;
887+ encoder . OpCode ( ILOpCode . Mul ) ;
888+ encoder . OpCode ( ILOpCode . Localloc ) ;
889+ encoder . StoreLocal ( 0 ) ;
890+
891+ for ( int i = 0 ; i < methodCount ; i ++ ) {
892+ encoder . LoadLocal ( 0 ) ;
893+ if ( i > 0 ) {
894+ encoder . LoadConstantI4 ( i ) ;
895+ encoder . OpCode ( ILOpCode . Sizeof ) ;
896+ encoder . Token ( _jniNativeMethodRef ) ;
897+ encoder . OpCode ( ILOpCode . Mul ) ;
898+ encoder . OpCode ( ILOpCode . Add ) ;
899+ }
900+
901+ encoder . OpCode ( ILOpCode . Ldsflda ) ;
902+ encoder . Token ( nameFields [ i ] ) ;
903+
904+ encoder . OpCode ( ILOpCode . Ldsflda ) ;
905+ encoder . Token ( sigFields [ i ] ) ;
906+
907+ encoder . OpCode ( ILOpCode . Ldftn ) ;
908+ encoder . Token ( validRegs [ i ] . Wrapper ) ;
909+
910+ encoder . OpCode ( ILOpCode . Newobj ) ;
911+ encoder . Token ( _jniNativeMethodCtorRef ) ;
912+ encoder . OpCode ( ILOpCode . Stobj ) ;
913+ encoder . Token ( _jniNativeMethodRef ) ;
914+ }
915+
916+ encoder . LoadArgument ( 1 ) ;
917+ encoder . OpCode ( ILOpCode . Callvirt ) ;
918+ encoder . Token ( _jniTypePeerReferenceRef ) ;
919+ encoder . StoreLocal ( 1 ) ;
920+
921+ encoder . LoadLocalAddress ( 2 ) ;
922+ encoder . LoadLocal ( 0 ) ;
923+ encoder . LoadConstantI4 ( methodCount ) ;
924+ encoder . Call ( _readOnlySpanOfJniNativeMethodCtorRef ) ;
925+
926+ encoder . LoadLocal ( 1 ) ;
927+ encoder . LoadLocal ( 2 ) ;
928+ encoder . Call ( _jniEnvTypesRegisterNativesRef ) ;
929+ encoder . OpCode ( ILOpCode . Ret ) ;
930+ } ,
931+ encodeLocals : localSig => {
932+ localSig . WriteByte ( 0x07 ) ;
933+ localSig . WriteCompressedInteger ( 3 ) ;
934+ localSig . WriteByte ( 0x18 ) ;
935+ localSig . WriteByte ( 0x11 ) ;
936+ localSig . WriteCompressedInteger ( CodedIndex . TypeDefOrRefOrSpec ( _jniObjectReferenceRef ) ) ;
937+ EncodeGenericValueTypeInst ( localSig , _readOnlySpanOpenRef , _jniNativeMethodRef ) ;
938+ } ) ;
939+ }
940+
941+ void AddUnmanagedCallersOnlyAttribute ( MethodDefinitionHandle handle )
942+ {
943+ _pe . Metadata . AddCustomAttribute ( handle , _ucoAttrCtorRef , _ucoAttrBlobHandle ) ;
944+ }
945+
946946 void EmitTypeMapAttribute ( TypeMapAttributeData entry )
947947 {
948948 var ctorRef = entry . IsUnconditional ? _typeMapAttrCtorRef2Arg : _typeMapAttrCtorRef3Arg ;
0 commit comments