GDMonoMethod *GDMonoClass::get_method_with_desc(const String &p_description, bool p_include_namespace) { MonoMethodDesc *desc = mono_method_desc_new(p_description.utf8().get_data(), p_include_namespace); MonoMethod *method = mono_method_desc_search_in_class(desc, mono_class); mono_method_desc_free(desc); ERR_FAIL_COND_V(mono_method_get_class(method) != mono_class, NULL); return get_method(method); }
MonoMethod *getMethodFromClass(MonoClass *cls, char *name) { MonoMethodDesc *mdesc; MonoMethod *method; mdesc = mono_method_desc_new(name, 1); method = mono_method_desc_search_in_class(mdesc, cls); mono_method_desc_free(mdesc); return method; }
// Get string from a Mono exception char* PyNet_ExceptionToString(MonoObject *e) { MonoMethodDesc* mdesc = mono_method_desc_new(":ToString()", FALSE); MonoMethod* mmethod = mono_method_desc_search_in_class(mdesc, mono_get_object_class()); mono_method_desc_free(mdesc); mmethod = mono_object_get_virtual_method(e, mmethod); MonoString* monoString = (MonoString*) mono_runtime_invoke(mmethod, e, NULL, NULL); mono_runtime_invoke(mmethod, e, NULL, NULL); return mono_string_to_utf8(monoString); }
void mono_cfg_dump_create_context (MonoCompile *cfg) { cfg->gdump_ctx = NULL; if (!cfg_dump_method_inited) { cfg_dump_method_name = g_getenv ("MONO_JIT_DUMP_METHOD"); cfg_dump_method_inited = TRUE; } if (!cfg_dump_method_name) return; const char *name = cfg_dump_method_name; if ((strchr (name, '.') > name) || strchr (name, ':')) { MonoMethodDesc *desc = mono_method_desc_new (name, TRUE); gboolean failed = !mono_method_desc_full_match (desc, cfg->method); mono_method_desc_free (desc); if (failed) return; } else if (strcmp (cfg->method->name, name) != 0) return; g_debug ("cfg_dump: create context for \"%s::%s\"", m_class_get_name (cfg->method->klass), cfg->method->name); int fd = create_socket (DEFAULT_HOST, DEFAULT_PORT); if (fd < 0) { g_warning ("cfg_dump: couldn't create socket: %s::%d", DEFAULT_HOST, DEFAULT_PORT); return; } MonoGraphDumper *ctx = (MonoGraphDumper *) mono_mempool_alloc0 (cfg->mempool, sizeof (MonoGraphDumper)); ctx->fd = fd; ctx->constant_pool = g_hash_table_new ((GHashFunc) constant_pool_hash, constant_pool_equal); ctx->insn2id = g_hash_table_new ((GHashFunc) instruction_hash, instruction_equal); ctx->next_cp_id = 1; ctx->next_insn_id = 0; cfg->gdump_ctx = ctx; }
static void load_roots (const char* filename) { FILE *file; char buf [2048]; char *p, *s; int line = 0; MonoImage *image = NULL; MonoClass *klass = NULL; MonoClassField *field; MonoMethodDesc *mdesc; MonoMethod *method; if (!(file = fopen (filename, "r"))) return; while (fgets (buf, sizeof (buf), file)) { /* FIXME: * decide on the format to use to express types, fields, methods, * maybe the same used on output from the tool, but with explicit * names and signatures instead of token indexes * add wildcard support */ ++line; s = buf; while (*s && g_ascii_isspace (*s)) ++s; switch (*s) { case 0: case '#': continue; /* comment */ case '[': p = strchr (s, ']'); if (!p) g_error ("invalid assembly format at line %d\n", line); *p = 0; p = s + 1; image = find_image (p); if (!image) g_error ("image not loaded: %s\n", p); klass = NULL; break; case 'T': if (s [1] != ':') g_error ("invalid type format at line %d\n", line); if (!image) break; klass = find_class (image, s + 2); break; case 'F': if (s [1] != ':') g_error ("invalid field format at line %d\n", line); if (!image || !klass) break; p = s + 2; if (*p == '*') { handle_type (klass, TYPE_FIELDS); break; } field = mono_class_get_field_from_name (klass, p); if (!field) g_warning ("no field '%s' at line %d\n", p, line); else add_field (field); break; case 'M': if (s [1] != ':') g_error ("invalid method format at line %d\n", line); if (!image || !klass) break; p = s + 2; if (*p == '*') { handle_type (klass, TYPE_METHODS); break; } mdesc = mono_method_desc_new (p, FALSE); if (!mdesc) { g_error ("invalid method desc at line %d\n", line); } method = mono_method_desc_search_in_class (mdesc, klass); if (!method) g_warning ("no method '%s' at line %d\n", p, line); else add_types_from_method (method); mono_method_desc_free (mdesc); break; default: g_error ("invalid format at line %d\n", line); } } fclose (file); }
JNIEXPORT jboolean JNICALL Java_com_koushikdutta_monojavabridge_MonoBridge_initializeMono (JNIEnv *env, jclass clazz, jstring debuggerAgentOptions) { // setenv("HOME", "/data/data/com.koushikdutta.twitter/", 1); #ifdef PLATFORM_ANDROID if (debuggerAgentOptions != NULL) { LOGI("Debugger enabled..."); int length = (*env)->GetStringLength(env, debuggerAgentOptions); const jbyte *str = (*env)->GetStringUTFChars(env, debuggerAgentOptions, NULL); char *copy = (char*)malloc(length + 1); copy[length] = NULL; memcpy(copy, str, length); mono_debugger_agent_parse_options(copy); free(copy); (*env)->ReleaseStringUTFChars(env, debuggerAgentOptions, str); mono_debug_init (MONO_DEBUG_FORMAT_MONO); } #endif //guint32 opt = mono_parse_default_optimizations(NULL); //mono_set_defaults (1, opt); //mono_trace_parse_options (""); setenv("MONO_PATH", "/data/data/com.koushikdutta.mono/", 0); #ifdef PLATFORM_ANDROID LOGI("mono_jit_init..."); #endif g_Domain = mono_jit_init (MONOJAVABRIDGE_DLL); #ifdef PLATFORM_ANDROID LOGI("mono_domain_assembly_open...", NULL); #endif g_Assembly = mono_domain_assembly_open (g_Domain, MONOJAVABRIDGE_DLL); if (!g_Assembly) { printf("Unable to load MonoJavaBridge.dll."); return FALSE; } mono_add_internal_call("MonoJavaBridge.JavaBridge::mono_object_to_pointer(object)", mono_objectpointer_conversion); mono_add_internal_call("MonoJavaBridge.JavaBridge::mono_pointer_to_object(intptr)", mono_objectpointer_conversion); mono_add_internal_call("MonoJavaBridge.JavaBridge::log(intptr)", logcat_print); MonoImage *image = mono_assembly_get_image(g_Assembly); MonoMethodDesc* desc = mono_method_desc_new ("MonoJavaBridge.JavaBridge:Initialize(intptr)", 1); MonoMethod* method = mono_method_desc_search_in_image (desc, image); mono_method_desc_free(desc); pointer args[1]; args[0] = &g_JavaVM; mono_runtime_invoke(method, NULL, args, NULL); desc = mono_method_desc_new ("MonoJavaBridge.JavaBridge:Link(intptr,intptr,intptr,intptr)", 1); g_Link = mono_method_desc_search_in_image (desc, image); mono_method_desc_free(desc); desc = mono_method_desc_new ("MonoJavaBridge.JavaBridge:LoadAssembly(intptr)", 1); g_LoadAssembly = mono_method_desc_search_in_image (desc, image); mono_method_desc_free(desc); return TRUE; }