[coop] CustomAttributeBuilder_GetBlob, etc. (mono/mono#16579)
authorJay Krell <jaykrell@microsoft.com>
Tue, 3 Sep 2019 22:52:41 +0000 (15:52 -0700)
committerZoltan Varga <vargaz@gmail.com>
Tue, 3 Sep 2019 22:52:41 +0000 (18:52 -0400)
mono_reflection_get_custom_attrs_blob_checked
 ModuleBuilder_WriteToFile
 ModuleBuilder_build_metadata

Commit migrated from https://github.com/mono/mono/commit/1780e1d1f8b01feafe6ddcb2c59d241122a6e61a

src/mono/mono/metadata/icall-def-netcore.h
src/mono/mono/metadata/icall-def.h
src/mono/mono/metadata/icall-table.h
src/mono/mono/metadata/object-internals.h
src/mono/mono/metadata/reflection-internals.h
src/mono/mono/metadata/sre.c

index 45b7c43..22a2e8f 100644 (file)
@@ -201,7 +201,7 @@ HANDLES(ASSEMB_1, "UpdateNativeCustomAttributes", ves_icall_AssemblyBuilder_Upda
 HANDLES(ASSEMB_2, "basic_init", ves_icall_AssemblyBuilder_basic_init, void, 1, (MonoReflectionAssemblyBuilder))
 
 ICALL_TYPE(CATTRB, "System.Reflection.Emit.CustomAttributeBuilder", CATTRB_1)
-ICALL(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob)
+HANDLES(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob, MonoArray, 7, (MonoReflectionAssembly, MonoObject, MonoArray, MonoArray, MonoArray, MonoArray, MonoArray))
 
 ICALL_TYPE(DYNM, "System.Reflection.Emit.DynamicMethod", DYNM_1)
 HANDLES(DYNM_1, "create_dynamic_method", ves_icall_DynamicMethod_create_dynamic_method, void, 1, (MonoReflectionDynamicMethod))
index 23ffc77..ac84f11 100644 (file)
@@ -610,7 +610,7 @@ HANDLES(ASSEMB_2, "basic_init", ves_icall_AssemblyBuilder_basic_init, void, 1, (
 
 #ifndef DISABLE_REFLECTION_EMIT
 ICALL_TYPE(CATTRB, "System.Reflection.Emit.CustomAttributeBuilder", CATTRB_1)
-ICALL(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob)
+HANDLES(CATTRB_1, "GetBlob", ves_icall_CustomAttributeBuilder_GetBlob, MonoArray, 7, (MonoReflectionAssembly, MonoObject, MonoArray, MonoArray, MonoArray, MonoArray, MonoArray))
 #endif
 
 ICALL_TYPE(DYNM, "System.Reflection.Emit.DynamicMethod", DYNM_1)
@@ -622,10 +622,9 @@ HANDLES(ENUMB_1, "setup_enum_type", ves_icall_EnumBuilder_setup_enum_type, void,
 ICALL_TYPE(MODULEB, "System.Reflection.Emit.ModuleBuilder", MODULEB_10)
 HANDLES(MODULEB_10, "GetRegisteredToken", ves_icall_ModuleBuilder_GetRegisteredToken, MonoObject, 2, (MonoReflectionModuleBuilder, guint32))
 HANDLES(MODULEB_8, "RegisterToken", ves_icall_ModuleBuilder_RegisterToken, void, 3, (MonoReflectionModuleBuilder, MonoObject, guint32))
-ICALL(MODULEB_1, "WriteToFile", ves_icall_ModuleBuilder_WriteToFile)
+HANDLES(MODULEB_1, "WriteToFile", ves_icall_ModuleBuilder_WriteToFile, void, 2, (MonoReflectionModuleBuilder, FILE_HANDLE))
 HANDLES(MODULEB_2, "basic_init", ves_icall_ModuleBuilder_basic_init, void, 1, (MonoReflectionModuleBuilder))
-
-ICALL(MODULEB_3, "build_metadata", ves_icall_ModuleBuilder_build_metadata)
+HANDLES(MODULEB_3, "build_metadata", ves_icall_ModuleBuilder_build_metadata, void, 1, (MonoReflectionModuleBuilder))
 HANDLES(MODULEB_5, "getMethodToken", ves_icall_ModuleBuilder_getMethodToken, gint32, 3, (MonoReflectionModuleBuilder, MonoReflectionMethod, MonoArray))
 HANDLES(MODULEB_6, "getToken", ves_icall_ModuleBuilder_getToken, gint32, 3, (MonoReflectionModuleBuilder, MonoObject, MonoBoolean))
 HANDLES(MODULEB_7, "getUSIndex", ves_icall_ModuleBuilder_getUSIndex, guint32, 2, (MonoReflectionModuleBuilder, MonoString))
index af253b3..26f6366 100644 (file)
@@ -47,7 +47,10 @@ typedef int *int_ptr;
 typedef int **int_ptr_ref;
 typedef guint8 **guint8_ptr_ref;
 typedef GPtrArray *GPtrArray_ptr;
+// HANDLE is not used just to avoid duplicate typedef warnings with some compilers.
+// gpointer == void* == HANDLE == FILE_HANDLE == PROCESS_HANDLE.
 typedef gpointer PROCESS_HANDLE;
+typedef gpointer FILE_HANDLE;
 typedef MonoAssemblyName *MonoAssemblyName_ptr;
 typedef MonoBoolean *MonoBoolean_ptr;
 typedef MonoClass *MonoClass_ptr;
@@ -173,8 +176,11 @@ typedef MonoStringHandle MonoStringOutHandle;
 #define MONO_HANDLE_TYPE_WRAP_guint8_ptr_ref           ICALL_HANDLES_WRAP_VALUETYPE_REF
 #define MONO_HANDLE_TYPE_WRAP_MonoResolveTokenError_ref        ICALL_HANDLES_WRAP_VALUETYPE_REF
 
+// HANDLE is not used just to avoid duplicate typedef warnings with some compilers.
+// gpointer == void* == HANDLE == FILE_HANDLE == PROCESS_HANDLE.
 #define MONO_HANDLE_TYPE_WRAP_char_ptr                 ICALL_HANDLES_WRAP_NONE
 #define MONO_HANDLE_TYPE_WRAP_const_char_ptr           ICALL_HANDLES_WRAP_NONE
+#define MONO_HANDLE_TYPE_WRAP_FILE_HANDLE              ICALL_HANDLES_WRAP_NONE
 #define MONO_HANDLE_TYPE_WRAP_MonoClass_ptr            ICALL_HANDLES_WRAP_NONE
 #define MONO_HANDLE_TYPE_WRAP_MonoEvent_ptr            ICALL_HANDLES_WRAP_NONE
 #define MONO_HANDLE_TYPE_WRAP_MonoGenericParamInfo_ptr ICALL_HANDLES_WRAP_NONE
@@ -184,7 +190,7 @@ typedef MonoStringHandle MonoStringOutHandle;
 #define MONO_HANDLE_TYPE_WRAP_MonoStackCrawlMark_ptr   ICALL_HANDLES_WRAP_NONE
 #define MONO_HANDLE_TYPE_WRAP_gint32_ptr               ICALL_HANDLES_WRAP_NONE
 #define MONO_HANDLE_TYPE_WRAP_gpointer_ptr             ICALL_HANDLES_WRAP_NONE
-#define MONO_HANDLE_TYPE_WRAP_PROCESS_HANDLE                   ICALL_HANDLES_WRAP_NONE
+#define MONO_HANDLE_TYPE_WRAP_PROCESS_HANDLE           ICALL_HANDLES_WRAP_NONE
 
 // Please keep this sorted (grep ICALL_HANDLES_WRAP_OBJ$ | sort)
 #define MONO_HANDLE_TYPE_WRAP_MonoAppContext                   ICALL_HANDLES_WRAP_OBJ
index 231dde9..960212c 100644 (file)
@@ -2208,18 +2208,6 @@ mono_runtime_exec_main_checked (MonoMethod *method, MonoArray *args, MonoError *
 int
 mono_runtime_try_exec_main (MonoMethod *method, MonoArray *args, MonoObject **exc);
 
-ICALL_EXPORT
-void
-ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, gpointer file);
-
-ICALL_EXPORT
-void
-ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb);
-
-ICALL_EXPORT
-MonoArray*
-ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues);
-
 MonoAssembly*
 mono_try_assembly_resolve_handle (MonoAssemblyLoadContext *alc, MonoStringHandle fname, MonoAssembly *requesting, gboolean refonly, MonoError *error);
 
index da4e51c..0f1c96a 100644 (file)
@@ -61,7 +61,7 @@ mono_reflection_get_custom_attrs_data_checked (MonoObjectHandle obj, MonoError *
 MonoArrayHandle
 mono_reflection_get_custom_attrs_by_type_handle (MonoObjectHandle obj, MonoClass *attr_klass, MonoError *error);
 
-MonoArray*
+MonoArrayHandle
 mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error);
 
 MonoCustomAttrInfo*
index 4add7e2..7e71876 100644 (file)
@@ -50,7 +50,9 @@
 #include "icall-decl.h"
 
 static GENERATE_GET_CLASS_WITH_CACHE (marshal_as_attribute, "System.Runtime.InteropServices", "MarshalAsAttribute");
+#ifndef DISABLE_REFLECTION_EMIT
 static GENERATE_GET_CLASS_WITH_CACHE (module_builder, "System.Reflection.Emit", "ModuleBuilder");
+#endif
 
 static char* string_to_utf8_image_raw (MonoImage *image, MonoString *s, MonoError *error);
 
@@ -2428,12 +2430,31 @@ encode_named_val (MonoReflectionAssembly *assembly, char *buffer, char *p, char
  * \returns a \c Byte array representing the blob of data.
  */
 MonoArray*
-mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) 
+mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues)
 {
+       HANDLE_FUNCTION_ENTER ();
+
+       MonoArrayHandle result;
+
+       MONO_ENTER_GC_UNSAFE;
+
        ERROR_DECL (error);
-       MonoArray *result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, error);
+
+       MONO_HANDLE_NEW (MonoReflectionAssembly, assembly);
+       MONO_HANDLE_NEW (MonoObject, ctor);
+       MONO_HANDLE_NEW (MonoArray, ctorArgs);
+       MONO_HANDLE_NEW (MonoArray, properties);
+       MONO_HANDLE_NEW (MonoArray, propValues);
+       MONO_HANDLE_NEW (MonoArray, fields);
+       MONO_HANDLE_NEW (MonoArray, fieldValues);
+
+       result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, error);
+
        mono_error_cleanup (error);
-       return result;
+
+       MONO_EXIT_GC_UNSAFE;
+
+       HANDLE_FUNCTION_RETURN_OBJ (result);
 }
 
 /**
@@ -2449,18 +2470,21 @@ mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObj
  * the custom attributed described by \p ctor, \p ctorArgs etc.
  * \returns a \c Byte array representing the blob of data.  On failure returns NULL and sets \p error.
  */
-MonoArray*
-mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error) 
+MonoArrayHandle
+mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues, MonoError *error)
 {
-       MonoArray *result = NULL;
+       MonoArrayHandle result = NULL_HANDLE_INIT;
        MonoMethodSignature *sig;
        MonoMethodSignature *sig_free = NULL;
        MonoObject *arg;
        char *buffer = NULL;
        char *p;
        guint32 buflen, i;
+       MonoObjectHandle h1 = NULL_HANDLE_INIT;
+       MonoObjectHandle h2 = NULL_HANDLE_INIT;
+       MonoObjectHandle argh = NULL_HANDLE_INIT;
 
-       error_init (error);
+       HANDLE_FUNCTION_ENTER ();
 
        if (strcmp (ctor->vtable->klass->name, "RuntimeConstructorInfo")) {
                /* sig is freed later so allocate it in the heap */
@@ -2477,8 +2501,12 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly,
        /* write the prolog */
        *p++ = 1;
        *p++ = 0;
+
+       argh = MONO_HANDLE_NEW (MonoObject, NULL);
+
        for (i = 0; i < sig->param_count; ++i) {
                arg = mono_array_get_internal (ctorArgs, MonoObject*, i);
+               MONO_HANDLE_ASSIGN_RAW (argh, arg);
                encode_cattr_value (assembly->assembly, buffer, p, &buffer, &p, &buflen, sig->params [i], arg, NULL, error);
                goto_if_nok (error, leave);
        }
@@ -2489,33 +2517,55 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly,
                i += mono_array_length_internal (fields);
        *p++ = i & 0xff;
        *p++ = (i >> 8) & 0xff;
+
+       if (properties || fields) {
+               h1 = MONO_HANDLE_NEW (MonoObject, NULL);
+               h2 = MONO_HANDLE_NEW (MonoObject, NULL);
+       }
+
        if (properties) {
+
                MonoObject *prop;
+
                for (i = 0; i < mono_array_length_internal (properties); ++i) {
                        MonoType *ptype;
                        char *pname;
 
                        prop = (MonoObject *)mono_array_get_internal (properties, gpointer, i);
+                       MONO_HANDLE_ASSIGN_RAW (h1, prop);
+
                        get_prop_name_and_type (prop, &pname, &ptype, error);
                        goto_if_nok (error, leave);
                        *p++ = 0x54; /* PROPERTY signature */
-                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ptype, pname, (MonoObject*)mono_array_get_internal (propValues, gpointer, i), error);
+
+                       prop = (MonoObject*)mono_array_get_internal (propValues, gpointer, i);
+                       MONO_HANDLE_ASSIGN_RAW (h2, prop);
+
+                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ptype, pname, prop, error);
                        g_free (pname);
                        goto_if_nok (error, leave);
                }
        }
 
        if (fields) {
+
                MonoObject *field;
+
                for (i = 0; i < mono_array_length_internal (fields); ++i) {
                        MonoType *ftype;
                        char *fname;
 
                        field = (MonoObject *)mono_array_get_internal (fields, gpointer, i);
+                       MONO_HANDLE_ASSIGN_RAW (h1, field);
+
                        get_field_name_and_type (field, &fname, &ftype, error);
                        goto_if_nok (error, leave);
                        *p++ = 0x53; /* FIELD signature */
-                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ftype, fname, (MonoObject*)mono_array_get_internal (fieldValues, gpointer, i), error);
+
+                       field = (MonoObject*)mono_array_get_internal (fieldValues, gpointer, i);
+                       MONO_HANDLE_ASSIGN_RAW (h2, field);
+
+                       encode_named_val (assembly, buffer, p, &buffer, &p, &buflen, ftype, fname, field, error);
                        g_free (fname);
                        goto_if_nok (error, leave);
                }
@@ -2523,14 +2573,15 @@ mono_reflection_get_custom_attrs_blob_checked (MonoReflectionAssembly *assembly,
 
        g_assert (p - buffer <= buflen);
        buflen = p - buffer;
-       result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error);
+       result = mono_array_new_handle (mono_domain_get (), mono_defaults.byte_class, buflen, error);
        goto_if_nok (error, leave);
-       p = mono_array_addr_internal (result, char, 0);
+       p = mono_array_addr_internal (MONO_HANDLE_RAW (result), char, 0);
        memcpy (p, buffer, buflen);
 leave:
        g_free (buffer);
        g_free (sig_free);
-       return result;
+
+       HANDLE_FUNCTION_RETURN_REF (MonoArray, result);
 }
 
 static gboolean
@@ -4442,7 +4493,7 @@ mono_reflection_resolve_object_handle (MonoImage *image, MonoObjectHandle obj, M
 #else /* DISABLE_REFLECTION_EMIT */
 
 MonoArray*
-mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues) 
+mono_reflection_get_custom_attrs_blob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues)
 {
        g_assert_not_reached ();
        return NULL;
@@ -4476,7 +4527,7 @@ mono_image_create_method_token (MonoDynamicImage *assembly, MonoObjectHandle obj
 }
 
 guint32
-mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj, 
+mono_image_create_token (MonoDynamicImage *assembly, MonoObjectHandle obj,
                         gboolean create_open_instance, gboolean register_token, MonoError *error)
 {
        g_assert_not_reached ();
@@ -4498,7 +4549,7 @@ ves_icall_TypeBuilder_create_runtime_class (MonoReflectionTypeBuilderHandle tb,
        return MONO_HANDLE_CAST (MonoReflectionType, NULL_HANDLE);
 }
 
-void 
+void
 ves_icall_DynamicMethod_create_dynamic_method (MonoReflectionDynamicMethodHandle mb, MonoError *error)
 {
        error_init (error);
@@ -4535,7 +4586,6 @@ mono_sre_generic_param_table_entry_free (GenericParamTableEntry *entry)
 gint32
 ves_icall_ModuleBuilder_getToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, MonoBoolean create_open_instance, MonoError *error)
 {
-       error_init (error);
        if (MONO_HANDLE_IS_NULL (obj)) {
                mono_error_set_argument_null (error, "obj", "");
                return 0;
@@ -4549,7 +4599,6 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilderHandle mb,
                                        MonoArrayHandle opt_param_types,
                                        MonoError *error)
 {
-       error_init (error);
        if (MONO_HANDLE_IS_NULL (method)) {
                mono_error_set_argument_null (error, "method", "");
                return 0;
@@ -4560,26 +4609,21 @@ ves_icall_ModuleBuilder_getMethodToken (MonoReflectionModuleBuilderHandle mb,
 
 #ifndef ENABLE_NETCORE
 void
-ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilder *mb, HANDLE file)
+ves_icall_ModuleBuilder_WriteToFile (MonoReflectionModuleBuilderHandle mb, HANDLE file, MonoError* error)
 {
-       ERROR_DECL (error);
-       mono_image_create_pefile (mb, file, error);
-       mono_error_set_pending_exception (error);
+       mono_image_create_pefile (MONO_HANDLE_RAW (mb), file, error);
 }
 
 void
-ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilder *mb)
+ves_icall_ModuleBuilder_build_metadata (MonoReflectionModuleBuilderHandle mb, MonoError* error)
 {
-       ERROR_DECL (error);
-       mono_image_build_metadata (mb, error);
-       mono_error_set_pending_exception (error);
+       mono_image_build_metadata (MONO_HANDLE_RAW (mb), error);
 }
 #endif
 
 void
 ves_icall_ModuleBuilder_RegisterToken (MonoReflectionModuleBuilderHandle mb, MonoObjectHandle obj, guint32 token, MonoError *error)
 {
-       error_init (error);
        /* This function may be called by ModuleBuilder.FixupTokens to update
         * an existing token, so replace is okay here. */
        mono_dynamic_image_register_token (MONO_HANDLE_GETVAL (mb, dynamic_image), token, obj, MONO_DYN_IMAGE_TOK_REPLACE);
@@ -4593,14 +4637,19 @@ ves_icall_ModuleBuilder_GetRegisteredToken (MonoReflectionModuleBuilderHandle mb
 }
 
 #ifndef DISABLE_REFLECTION_EMIT
-MonoArray*
-ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssembly *assembly, MonoObject *ctor, MonoArray *ctorArgs, MonoArray *properties, MonoArray *propValues, MonoArray *fields, MonoArray* fieldValues)
+
+MonoArrayHandle
+ves_icall_CustomAttributeBuilder_GetBlob (MonoReflectionAssemblyHandle assembly, MonoObjectHandle ctor,
+                                         MonoArrayHandle ctorArgs, MonoArrayHandle properties,
+                                         MonoArrayHandle propValues, MonoArrayHandle fields,
+                                         MonoArrayHandle fieldValues, MonoError* error)
 {
-       ERROR_DECL (error);
-       MonoArray *result = mono_reflection_get_custom_attrs_blob_checked (assembly, ctor, ctorArgs, properties, propValues, fields, fieldValues, error);
-       mono_error_set_pending_exception (error);
-       return result;
+       return mono_reflection_get_custom_attrs_blob_checked (MONO_HANDLE_RAW (assembly), MONO_HANDLE_RAW (ctor),
+                                                             MONO_HANDLE_RAW (ctorArgs), MONO_HANDLE_RAW (properties),
+                                                             MONO_HANDLE_RAW (propValues), MONO_HANDLE_RAW (fields),
+                                                             MONO_HANDLE_RAW (fieldValues), error);
 }
+
 #endif
 
 void
@@ -4628,14 +4677,12 @@ ves_icall_EnumBuilder_setup_enum_type (MonoReflectionTypeHandle enumtype,
                                       MonoReflectionTypeHandle t,
                                       MonoError *error)
 {
-       error_init (error);
        MONO_HANDLE_SETVAL (enumtype, type, MonoType*, MONO_HANDLE_GETVAL (t, type));
 }
 
 void
 ves_icall_ModuleBuilder_basic_init (MonoReflectionModuleBuilderHandle moduleb, MonoError *error)
 {
-       error_init (error);
        mono_image_module_basic_init (moduleb, error);
 }
 
@@ -4648,7 +4695,6 @@ ves_icall_ModuleBuilder_getUSIndex (MonoReflectionModuleBuilderHandle module, Mo
 void
 ves_icall_ModuleBuilder_set_wrappers_type (MonoReflectionModuleBuilderHandle moduleb, MonoReflectionTypeHandle ref_type, MonoError *error)
 {
-       error_init (error);
        MonoDynamicImage *image = MONO_HANDLE_GETVAL (moduleb, dynamic_image);
        MonoType *type = MONO_HANDLE_GETVAL (ref_type, type);