Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion mono/metadata/icall-def.h
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,7 @@ HANDLES(ICALL(MODULE_7, "ResolveFieldToken", ves_icall_System_Reflection_Module_
HANDLES(ICALL(MODULE_8, "ResolveMemberToken", ves_icall_System_Reflection_Module_ResolveMemberToken))
HANDLES(ICALL(MODULE_9, "ResolveMethodToken", ves_icall_System_Reflection_Module_ResolveMethodToken))
HANDLES(ICALL(MODULE_10, "ResolveSignature", ves_icall_System_Reflection_Module_ResolveSignature))
ICALL(MODULE_11, "ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken)
HANDLES(ICALL(MODULE_11, "ResolveStringToken", ves_icall_System_Reflection_Module_ResolveStringToken))
HANDLES(ICALL(MODULE_12, "ResolveTypeToken", ves_icall_System_Reflection_Module_ResolveTypeToken))
HANDLES(ICALL(MODULE_13, "get_MetadataToken", ves_icall_reflection_get_token))

Expand Down
21 changes: 10 additions & 11 deletions mono/metadata/icall.c
Original file line number Diff line number Diff line change
Expand Up @@ -6004,36 +6004,35 @@ ves_icall_System_Reflection_Module_ResolveMethodToken (MonoImage *image, guint32
return module_resolve_method_token (image, token, type_args, method_args, resolve_error, error);
}

ICALL_EXPORT MonoString*
ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error)
ICALL_EXPORT MonoStringHandle
ves_icall_System_Reflection_Module_ResolveStringToken (MonoImage *image, guint32 token, MonoResolveTokenError *resolve_error, MonoError *error)
{
ERROR_DECL (error);
int index = mono_metadata_token_index (token);

*resolve_error = ResolveTokenError_Other;

/* Validate token */
if (mono_metadata_token_code (token) != MONO_TOKEN_STRING) {
*resolve_error = ResolveTokenError_BadTable;
return NULL;
return NULL_HANDLE_STRING;
}

if (image_is_dynamic (image)) {
MonoString * result = (MonoString *)mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, error);
mono_error_cleanup (error);
ERROR_DECL (ignore_inner_error);
// FIXME ignoring error
// FIXME Push MONO_HANDLE_NEW to lower layers.
MonoStringHandle result = MONO_HANDLE_NEW (MonoString, mono_lookup_dynamic_token_class (image, token, FALSE, NULL, NULL, ignore_inner_error));
mono_error_cleanup (ignore_inner_error);
return result;
}

if ((index <= 0) || (index >= image->heap_us.size)) {
*resolve_error = ResolveTokenError_OutOfRange;
return NULL;
return NULL_HANDLE_STRING;
}

/* FIXME: What to do if the index points into the middle of a string ? */

MonoString *result = mono_ldstr_checked (mono_domain_get (), image, index, error);
mono_error_set_pending_exception (error);
return result;
return mono_ldstr_handle (mono_domain_get (), image, index, error);
}

static MonoClassField*
Expand Down
3 changes: 3 additions & 0 deletions mono/metadata/object-internals.h
Original file line number Diff line number Diff line change
Expand Up @@ -1926,6 +1926,9 @@ mono_string_new_size_checked (MonoDomain *domain, gint32 len, MonoError *error);
MonoString*
mono_ldstr_checked (MonoDomain *domain, MonoImage *image, uint32_t str_index, MonoError *error);

MonoStringHandle
mono_ldstr_handle (MonoDomain *domain, MonoImage *image, uint32_t str_index, MonoError *error);

MonoString*
mono_string_new_len_checked (MonoDomain *domain, const char *text, guint length, MonoError *error);

Expand Down
7 changes: 7 additions & 0 deletions mono/metadata/object.c
Original file line number Diff line number Diff line change
Expand Up @@ -7331,6 +7331,13 @@ mono_ldstr_checked (MonoDomain *domain, MonoImage *image, guint32 idx, MonoError
}
}

MonoStringHandle
mono_ldstr_handle (MonoDomain *domain, MonoImage *image, guint32 idx, MonoError *error)
{
// FIXME invert mono_ldstr_handle and mono_ldstr_checked.
return MONO_HANDLE_NEW (MonoString, mono_ldstr_checked (mono_domain_get (), image, index, error));
}

/**
* mono_ldstr_metadata_sig
* \param domain the domain for the string
Expand Down