@@ -770,104 +770,6 @@ MethodDefinitionHandle EmitUcoMethod (UcoMethodData uco)
770770 return handle ;
771771 }
772772
773- void EmitRegisterNatives ( List < NativeRegistrationData > registrations , Dictionary < string , MethodDefinitionHandle > wrapperHandles )
774- {
775- var validRegs = new List < ( NativeRegistrationData Reg , MethodDefinitionHandle Wrapper ) > ( registrations . Count ) ;
776- foreach ( var reg in registrations ) {
777- if ( wrapperHandles . TryGetValue ( reg . WrapperMethodName , out var wrapperHandle ) ) {
778- validRegs . Add ( ( reg , wrapperHandle ) ) ;
779- }
780- }
781-
782- if ( validRegs . Count == 0 ) {
783- _pe . EmitBody ( "RegisterNatives" ,
784- MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
785- MethodAttributes . NewSlot | MethodAttributes . Final ,
786- sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
787- rt => rt . Void ( ) ,
788- p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
789- encoder => encoder . OpCode ( ILOpCode . Ret ) ) ;
790- return ;
791- }
792-
793- var nameFields = new FieldDefinitionHandle [ validRegs . Count ] ;
794- var sigFields = new FieldDefinitionHandle [ validRegs . Count ] ;
795- for ( int i = 0 ; i < validRegs . Count ; i ++ ) {
796- nameFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniMethodName ) ;
797- sigFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniSignature ) ;
798- }
799-
800- int methodCount = validRegs . Count ;
801-
802- _pe . EmitBody ( "RegisterNatives" ,
803- MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
804- MethodAttributes . NewSlot | MethodAttributes . Final ,
805- sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
806- rt => rt . Void ( ) ,
807- p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
808- encoder => {
809- encoder . LoadConstantI4 ( methodCount ) ;
810- encoder . OpCode ( ILOpCode . Sizeof ) ;
811- encoder . Token ( _jniNativeMethodRef ) ;
812- encoder . OpCode ( ILOpCode . Mul ) ;
813- encoder . OpCode ( ILOpCode . Localloc ) ;
814- encoder . StoreLocal ( 0 ) ;
815-
816- for ( int i = 0 ; i < methodCount ; i ++ ) {
817- encoder . LoadLocal ( 0 ) ;
818- if ( i > 0 ) {
819- encoder . LoadConstantI4 ( i ) ;
820- encoder . OpCode ( ILOpCode . Sizeof ) ;
821- encoder . Token ( _jniNativeMethodRef ) ;
822- encoder . OpCode ( ILOpCode . Mul ) ;
823- encoder . OpCode ( ILOpCode . Add ) ;
824- }
825-
826- encoder . OpCode ( ILOpCode . Ldsflda ) ;
827- encoder . Token ( nameFields [ i ] ) ;
828-
829- encoder . OpCode ( ILOpCode . Ldsflda ) ;
830- encoder . Token ( sigFields [ i ] ) ;
831-
832- encoder . OpCode ( ILOpCode . Ldftn ) ;
833- encoder . Token ( validRegs [ i ] . Wrapper ) ;
834-
835- encoder . OpCode ( ILOpCode . Newobj ) ;
836- encoder . Token ( _jniNativeMethodCtorRef ) ;
837- encoder . OpCode ( ILOpCode . Stobj ) ;
838- encoder . Token ( _jniNativeMethodRef ) ;
839- }
840-
841- encoder . LoadArgument ( 1 ) ;
842- encoder . OpCode ( ILOpCode . Callvirt ) ;
843- encoder . Token ( _jniTypePeerReferenceRef ) ;
844- encoder . StoreLocal ( 1 ) ;
845-
846- encoder . LoadLocalAddress ( 2 ) ;
847- encoder . LoadLocal ( 0 ) ;
848- encoder . LoadConstantI4 ( methodCount ) ;
849- encoder . Call ( _readOnlySpanOfJniNativeMethodCtorRef ) ;
850-
851- encoder . LoadLocal ( 1 ) ;
852- encoder . LoadLocal ( 2 ) ;
853- encoder . Call ( _jniEnvTypesRegisterNativesRef ) ;
854- encoder . OpCode ( ILOpCode . Ret ) ;
855- } ,
856- encodeLocals : localSig => {
857- localSig . WriteByte ( 0x07 ) ;
858- localSig . WriteCompressedInteger ( 3 ) ;
859- localSig . WriteByte ( 0x18 ) ;
860- localSig . WriteByte ( 0x11 ) ;
861- localSig . WriteCompressedInteger ( CodedIndex . TypeDefOrRefOrSpec ( _jniObjectReferenceRef ) ) ;
862- EncodeGenericValueTypeInst ( localSig , _readOnlySpanOpenRef , _jniNativeMethodRef ) ;
863- } ) ;
864- }
865-
866- void AddUnmanagedCallersOnlyAttribute ( MethodDefinitionHandle handle )
867- {
868- _pe . Metadata . AddCustomAttribute ( handle , _ucoAttrCtorRef , _ucoAttrBlobHandle ) ;
869- }
870-
871773 MethodDefinitionHandle EmitUcoConstructor ( UcoConstructorData uco , JavaPeerProxyData proxy )
872774 {
873775 var targetTypeRef = _pe . ResolveTypeRef ( uco . TargetType ) ;
@@ -983,6 +885,104 @@ MethodDefinitionHandle EmitUcoConstructor (UcoConstructorData uco, JavaPeerProxy
983885 return handle ;
984886 }
985887
888+ void EmitRegisterNatives ( List < NativeRegistrationData > registrations , Dictionary < string , MethodDefinitionHandle > wrapperHandles )
889+ {
890+ var validRegs = new List < ( NativeRegistrationData Reg , MethodDefinitionHandle Wrapper ) > ( registrations . Count ) ;
891+ foreach ( var reg in registrations ) {
892+ if ( wrapperHandles . TryGetValue ( reg . WrapperMethodName , out var wrapperHandle ) ) {
893+ validRegs . Add ( ( reg , wrapperHandle ) ) ;
894+ }
895+ }
896+
897+ if ( validRegs . Count == 0 ) {
898+ _pe . EmitBody ( "RegisterNatives" ,
899+ MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
900+ MethodAttributes . NewSlot | MethodAttributes . Final ,
901+ sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
902+ rt => rt . Void ( ) ,
903+ p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
904+ encoder => encoder . OpCode ( ILOpCode . Ret ) ) ;
905+ return ;
906+ }
907+
908+ var nameFields = new FieldDefinitionHandle [ validRegs . Count ] ;
909+ var sigFields = new FieldDefinitionHandle [ validRegs . Count ] ;
910+ for ( int i = 0 ; i < validRegs . Count ; i ++ ) {
911+ nameFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniMethodName ) ;
912+ sigFields [ i ] = _pe . GetOrAddUtf8Field ( validRegs [ i ] . Reg . JniSignature ) ;
913+ }
914+
915+ int methodCount = validRegs . Count ;
916+
917+ _pe . EmitBody ( "RegisterNatives" ,
918+ MethodAttributes . Public | MethodAttributes . Virtual | MethodAttributes . HideBySig |
919+ MethodAttributes . NewSlot | MethodAttributes . Final ,
920+ sig => sig . MethodSignature ( isInstanceMethod : true ) . Parameters ( 1 ,
921+ rt => rt . Void ( ) ,
922+ p => p . AddParameter ( ) . Type ( ) . Type ( _jniTypeRef , false ) ) ,
923+ encoder => {
924+ encoder . LoadConstantI4 ( methodCount ) ;
925+ encoder . OpCode ( ILOpCode . Sizeof ) ;
926+ encoder . Token ( _jniNativeMethodRef ) ;
927+ encoder . OpCode ( ILOpCode . Mul ) ;
928+ encoder . OpCode ( ILOpCode . Localloc ) ;
929+ encoder . StoreLocal ( 0 ) ;
930+
931+ for ( int i = 0 ; i < methodCount ; i ++ ) {
932+ encoder . LoadLocal ( 0 ) ;
933+ if ( i > 0 ) {
934+ encoder . LoadConstantI4 ( i ) ;
935+ encoder . OpCode ( ILOpCode . Sizeof ) ;
936+ encoder . Token ( _jniNativeMethodRef ) ;
937+ encoder . OpCode ( ILOpCode . Mul ) ;
938+ encoder . OpCode ( ILOpCode . Add ) ;
939+ }
940+
941+ encoder . OpCode ( ILOpCode . Ldsflda ) ;
942+ encoder . Token ( nameFields [ i ] ) ;
943+
944+ encoder . OpCode ( ILOpCode . Ldsflda ) ;
945+ encoder . Token ( sigFields [ i ] ) ;
946+
947+ encoder . OpCode ( ILOpCode . Ldftn ) ;
948+ encoder . Token ( validRegs [ i ] . Wrapper ) ;
949+
950+ encoder . OpCode ( ILOpCode . Newobj ) ;
951+ encoder . Token ( _jniNativeMethodCtorRef ) ;
952+ encoder . OpCode ( ILOpCode . Stobj ) ;
953+ encoder . Token ( _jniNativeMethodRef ) ;
954+ }
955+
956+ encoder . LoadArgument ( 1 ) ;
957+ encoder . OpCode ( ILOpCode . Callvirt ) ;
958+ encoder . Token ( _jniTypePeerReferenceRef ) ;
959+ encoder . StoreLocal ( 1 ) ;
960+
961+ encoder . LoadLocalAddress ( 2 ) ;
962+ encoder . LoadLocal ( 0 ) ;
963+ encoder . LoadConstantI4 ( methodCount ) ;
964+ encoder . Call ( _readOnlySpanOfJniNativeMethodCtorRef ) ;
965+
966+ encoder . LoadLocal ( 1 ) ;
967+ encoder . LoadLocal ( 2 ) ;
968+ encoder . Call ( _jniEnvTypesRegisterNativesRef ) ;
969+ encoder . OpCode ( ILOpCode . Ret ) ;
970+ } ,
971+ encodeLocals : localSig => {
972+ localSig . WriteByte ( 0x07 ) ;
973+ localSig . WriteCompressedInteger ( 3 ) ;
974+ localSig . WriteByte ( 0x18 ) ;
975+ localSig . WriteByte ( 0x11 ) ;
976+ localSig . WriteCompressedInteger ( CodedIndex . TypeDefOrRefOrSpec ( _jniObjectReferenceRef ) ) ;
977+ EncodeGenericValueTypeInst ( localSig , _readOnlySpanOpenRef , _jniNativeMethodRef ) ;
978+ } ) ;
979+ }
980+
981+ void AddUnmanagedCallersOnlyAttribute ( MethodDefinitionHandle handle )
982+ {
983+ _pe . Metadata . AddCustomAttribute ( handle , _ucoAttrCtorRef , _ucoAttrBlobHandle ) ;
984+ }
985+
986986 void EmitTypeMapAttribute ( TypeMapAttributeData entry )
987987 {
988988 var ctorRef = entry . IsUnconditional ? _typeMapAttrCtorRef2Arg : _typeMapAttrCtorRef3Arg ;
0 commit comments