+void*
+mono_aot_readonly_field_override (MonoClassField *field)
+{
+ ReadOnlyValue *rdv;
+ for (rdv = readonly_values; rdv; rdv = rdv->next) {
+ char *p = rdv->name;
+ int len;
+ len = strlen (field->parent->name_space);
+ if (strncmp (p, field->parent->name_space, len))
+ continue;
+ p += len;
+ if (*p++ != '.')
+ continue;
+ len = strlen (field->parent->name);
+ if (strncmp (p, field->parent->name, len))
+ continue;
+ p += len;
+ if (*p++ != '.')
+ continue;
+ if (strcmp (p, field->name))
+ continue;
+ switch (rdv->type) {
+ case MONO_TYPE_I1:
+ return &rdv->value.i1;
+ case MONO_TYPE_I2:
+ return &rdv->value.i2;
+ case MONO_TYPE_I4:
+ return &rdv->value.i4;
+ default:
+ break;
+ }
+ }
+ return NULL;
+}
+
+static void
+add_readonly_value (MonoAotOptions *opts, const char *val)
+{
+ ReadOnlyValue *rdv;
+ const char *fval;
+ const char *tval;
+ /* the format of val is:
+ * namespace.typename.fieldname=type/value
+ * type can be i1 for uint8/int8/boolean, i2 for uint16/int16/char, i4 for uint32/int32
+ */
+ fval = strrchr (val, '/');
+ if (!fval) {
+ fprintf (stderr, "AOT : invalid format for readonly field '%s', missing /.\n", val);
+ exit (1);
+ }
+ tval = strrchr (val, '=');
+ if (!tval) {
+ fprintf (stderr, "AOT : invalid format for readonly field '%s', missing =.\n", val);
+ exit (1);
+ }
+ rdv = g_new0 (ReadOnlyValue, 1);
+ rdv->name = g_malloc0 (tval - val + 1);
+ memcpy (rdv->name, val, tval - val);
+ tval++;
+ fval++;
+ if (strncmp (tval, "i1", 2) == 0) {
+ rdv->value.i1 = atoi (fval);
+ rdv->type = MONO_TYPE_I1;
+ } else if (strncmp (tval, "i2", 2) == 0) {
+ rdv->value.i2 = atoi (fval);
+ rdv->type = MONO_TYPE_I2;
+ } else if (strncmp (tval, "i4", 2) == 0) {
+ rdv->value.i4 = atoi (fval);
+ rdv->type = MONO_TYPE_I4;
+ } else {
+ fprintf (stderr, "AOT : unsupported type for readonly field '%s'.\n", tval);
+ exit (1);
+ }
+ rdv->next = readonly_values;
+ readonly_values = rdv;
+}
+