X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fsre-encode.c;h=5ff236fc12edf97e008528de56ab031899af8e2b;hb=HEAD;hp=ecd2339cdf29691da77ff9c7a9ad82858a46ea47;hpb=f704d56c378b28e252572db4730a6e13edc14aa0;p=mono.git diff --git a/mono/metadata/sre-encode.c b/mono/metadata/sre-encode.c index ecd2339cdf2..5ff236fc12e 100644 --- a/mono/metadata/sre-encode.c +++ b/mono/metadata/sre-encode.c @@ -771,6 +771,7 @@ guint32 mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType *type, gboolean try_typespec) { MONO_REQ_GC_UNSAFE_MODE; + HANDLE_FUNCTION_ENTER (); MonoDynamicTable *table; guint32 *values; @@ -779,10 +780,10 @@ mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType * /* if the type requires a typespec, we must try that first*/ if (try_typespec && (token = create_typespec (assembly, type))) - return token; + goto leave; token = GPOINTER_TO_UINT (g_hash_table_lookup (assembly->typeref, type)); if (token) - return token; + goto leave; klass = mono_class_from_mono_type (type); MonoReflectionTypeBuilderHandle tb = MONO_HANDLE_CAST (MonoReflectionTypeBuilder, mono_class_get_ref_info (klass)); @@ -792,8 +793,9 @@ mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType * if ((klass->image == &assembly->image) && (type->type != MONO_TYPE_VAR) && (type->type != MONO_TYPE_MVAR)) { token = MONO_TYPEDEFORREF_TYPEDEF | (MONO_HANDLE_GETVAL (tb, table_idx) << MONO_TYPEDEFORREF_BITS); - mono_dynamic_image_register_token (assembly, token, MONO_HANDLE_CAST (MonoObject, tb)); - return token; + /* This function is called multiple times from sre and sre-save, so same object is okay */ + mono_dynamic_image_register_token (assembly, token, MONO_HANDLE_CAST (MonoObject, tb), MONO_DYN_IMAGE_TOK_SAME_OK); + goto leave; } if (klass->nested_in) { @@ -815,8 +817,15 @@ mono_dynimage_encode_typedef_or_ref_full (MonoDynamicImage *assembly, MonoType * token = MONO_TYPEDEFORREF_TYPEREF | (table->next_idx << MONO_TYPEDEFORREF_BITS); /* typeref */ g_hash_table_insert (assembly->typeref, type, GUINT_TO_POINTER(token)); table->next_idx ++; - mono_dynamic_image_register_token (assembly, token, MONO_HANDLE_CAST (MonoObject, tb)); - return token; + + + if (!MONO_HANDLE_IS_NULL (tb)) { + /* This function is called multiple times from sre and sre-save, so same object is okay */ + mono_dynamic_image_register_token (assembly, token, MONO_HANDLE_CAST (MonoObject, tb), MONO_DYN_IMAGE_TOK_SAME_OK); + } + +leave: + HANDLE_FUNCTION_RETURN_VAL (token); } /* @@ -948,14 +957,25 @@ mono_dynimage_encode_reflection_sighelper (MonoDynamicImage *assembly, MonoRefle } #endif /* DISABLE_REFLECTION_EMIT */ -static MonoArray * -reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig, MonoError *error) +static gboolean +encode_reflection_types (MonoDynamicImage *assembly, MonoArrayHandle sig_arguments, int i, SigBuffer *buf, MonoError *error) { - MonoReflectionModuleBuilder *module = sig->module; - MonoDynamicImage *assembly = module != NULL ? module->dynamic_image : NULL; - guint32 na = sig->arguments ? mono_array_length (sig->arguments) : 0; + HANDLE_FUNCTION_ENTER (); + error_init (error); + MonoReflectionTypeHandle type = MONO_HANDLE_NEW (MonoReflectionType, NULL); + MONO_HANDLE_ARRAY_GETREF (type, sig_arguments, i); + encode_reflection_type (assembly, type, buf, error); + HANDLE_FUNCTION_RETURN_VAL (is_ok (error)); +} + +static MonoArrayHandle +reflection_sighelper_get_signature_local (MonoReflectionSigHelperHandle sig, MonoError *error) +{ + MonoReflectionModuleBuilderHandle module = MONO_HANDLE_NEW_GET (MonoReflectionModuleBuilder, sig, module); + MonoDynamicImage *assembly = MONO_HANDLE_IS_NULL (module) ? NULL : MONO_HANDLE_GETVAL (module, dynamic_image); + MonoArrayHandle sig_arguments = MONO_HANDLE_NEW_GET (MonoArray, sig, arguments); + guint32 na = MONO_HANDLE_IS_NULL (sig_arguments) ? 0 : mono_array_handle_length (sig_arguments); guint32 buflen, i; - MonoArray *result; SigBuffer buf; error_init (error); @@ -966,30 +986,33 @@ reflection_sighelper_get_signature_local (MonoReflectionSigHelper *sig, MonoErro sigbuffer_add_value (&buf, na); if (assembly != NULL){ for (i = 0; i < na; ++i) { - MonoReflectionType *type = mono_array_get (sig->arguments, MonoReflectionType*, i); - encode_reflection_type_raw (assembly, type, &buf, error); - if (!is_ok (error)) goto fail; + if (!encode_reflection_types (assembly, sig_arguments, i, &buf, error)) + goto fail; } } buflen = buf.p - buf.buf; - result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error); + MonoArrayHandle result = mono_array_new_handle (mono_domain_get (), mono_defaults.byte_class, buflen, error); if (!is_ok (error)) goto fail; - memcpy (mono_array_addr (result, char, 0), buf.buf, buflen); + uint32_t gchandle; + void *base = MONO_ARRAY_HANDLE_PIN (result, char, 0, &gchandle); + memcpy (base, buf.buf, buflen); sigbuffer_free (&buf); + mono_gchandle_free (gchandle); return result; fail: sigbuffer_free (&buf); - return NULL; + return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE); } -static MonoArray * -reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig, MonoError *error) +static MonoArrayHandle +reflection_sighelper_get_signature_field (MonoReflectionSigHelperHandle sig, MonoError *error) { - MonoDynamicImage *assembly = sig->module->dynamic_image; - guint32 na = sig->arguments ? mono_array_length (sig->arguments) : 0; + MonoReflectionModuleBuilderHandle module = MONO_HANDLE_NEW_GET (MonoReflectionModuleBuilder, sig, module); + MonoDynamicImage *assembly = MONO_HANDLE_GETVAL (module, dynamic_image); + MonoArrayHandle sig_arguments = MONO_HANDLE_NEW_GET (MonoArray, sig, arguments); + guint32 na = MONO_HANDLE_IS_NULL (sig_arguments) ? 0 : mono_array_handle_length (sig_arguments); guint32 buflen, i; - MonoArray *result; SigBuffer buf; error_init (error); @@ -998,22 +1021,23 @@ reflection_sighelper_get_signature_field (MonoReflectionSigHelper *sig, MonoErro sigbuffer_add_value (&buf, 0x06); for (i = 0; i < na; ++i) { - MonoReflectionType *type = mono_array_get (sig->arguments, MonoReflectionType*, i); - encode_reflection_type_raw (assembly, type, &buf, error); - if (!is_ok (error)) + if (! encode_reflection_types (assembly, sig_arguments, i, &buf, error)) goto fail; } buflen = buf.p - buf.buf; - result = mono_array_new_checked (mono_domain_get (), mono_defaults.byte_class, buflen, error); + MonoArrayHandle result = mono_array_new_handle (mono_domain_get (), mono_defaults.byte_class, buflen, error); if (!is_ok (error)) goto fail; - memcpy (mono_array_addr (result, char, 0), buf.buf, buflen); + uint32_t gchandle; + void *base = MONO_ARRAY_HANDLE_PIN (result, char, 0, &gchandle); + memcpy (base, buf.buf, buflen); sigbuffer_free (&buf); + mono_gchandle_free (gchandle); return result; fail: sigbuffer_free (&buf); - return NULL; + return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE); } static char* @@ -1200,36 +1224,34 @@ mono_dynimage_save_encode_property_signature (MonoDynamicImage *assembly, MonoRe #endif /*DISABLE_REFLECTION_EMIT_SAVE*/ #ifndef DISABLE_REFLECTION_EMIT -MonoArray * -ves_icall_SignatureHelper_get_signature_local (MonoReflectionSigHelper *sig) +MonoArrayHandle +ves_icall_SignatureHelper_get_signature_local (MonoReflectionSigHelperHandle sig, MonoError *error) { - MonoError error; - MonoArray *result = reflection_sighelper_get_signature_local (sig, &error); - mono_error_set_pending_exception (&error); - return result; + error_init (error); + return reflection_sighelper_get_signature_local (sig, error); } -MonoArray * -ves_icall_SignatureHelper_get_signature_field (MonoReflectionSigHelper *sig) +MonoArrayHandle +ves_icall_SignatureHelper_get_signature_field (MonoReflectionSigHelperHandle sig, MonoError *error) { - MonoError error; - MonoArray *result = reflection_sighelper_get_signature_field (sig, &error); - mono_error_set_pending_exception (&error); - return result; + error_init (error); + return reflection_sighelper_get_signature_field (sig, error); } #else /* DISABLE_REFLECTION_EMIT */ -MonoArray * -ves_icall_SignatureHelper_get_signature_local (MonoReflectionSigHelper *sig) +MonoArrayHandle +ves_icall_SignatureHelper_get_signature_local (MonoReflectionSigHelperHandle sig, MonoError *error) { + error_init (error); g_assert_not_reached (); - return NULL; + return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE); } -MonoArray * -ves_icall_SignatureHelper_get_signature_field (MonoReflectionSigHelper *sig) +MonoArrayHandle +ves_icall_SignatureHelper_get_signature_field (MonoReflectionSigHelperHandle sig, MonoError *error) { + error_init (error); g_assert_not_reached (); - return NULL; + return MONO_HANDLE_CAST (MonoArray, NULL_HANDLE); } #endif /* DISABLE_REFLECTION_EMIT */