2001-08-21 Dietmar Maurer <dietmar@ximian.com>
[mono.git] / mono / metadata / object.c
index 44bc9d7c431ba42a71218a172e0840e54886b707..6b404260d615300d52f800a2c776665bb63566d7 100644 (file)
@@ -9,8 +9,8 @@
 #include <config.h>
 #include <stdlib.h>
 #include <stdio.h>
-#include <mono/cli/cli.h>
-#include <mono/cli/object.h>
+#include <mono/metadata/loader.h>
+#include <mono/metadata/object.h>
 
 /**
  * mono_object_allocate:
@@ -65,6 +65,26 @@ mono_object_new (MonoImage *image, guint32 type_token)
        return o;
 }
 
+/**
+ * mono_object_clone:
+ * @obj: the object to clone
+ *
+ * Returns: A newly created object who is a shallow copy of @obj
+ */
+MonoObject *
+mono_object_clone (MonoObject *obj)
+{
+       MonoObject *o;
+       int size;
+       
+       size = obj->klass->instance_size;
+       o = mono_object_allocate (size);
+       
+       memcpy (o, obj, size);
+
+       return o;
+}
+
 /*
  * mono_new_szarray:
  * @image: image where the object is being referenced
@@ -80,7 +100,6 @@ mono_new_szarray (MonoImage *image, guint32 etype, guint32 n)
        MonoObject *o;
        MonoArrayObject *ao;
        MonoArrayClass *ac;
-       guint32 esize;
 
        c = mono_array_class_get (image, etype, 1);
        g_assert (c != NULL);
@@ -95,7 +114,82 @@ mono_new_szarray (MonoImage *image, guint32 etype, guint32 n)
        ao->bounds [0].length = n;
        ao->bounds [0].lower_bound = 0;
 
-       ao->vector = g_malloc0 (n * ac->esize);
+       
+       ao->vector = g_malloc0 (n * mono_array_element_size (ac));
+
+       return o;
+}
+
+MonoObject *
+mono_new_utf16_string (const char *text, gint32 len)
+{
+       MonoObject *s;
+       MonoArrayObject *ca;
+
+       s = mono_object_new (mono_defaults.corlib, mono_defaults.string_token);
+       g_assert (s != NULL);
+
+       ca = (MonoArrayObject *)mono_new_szarray (mono_defaults.corlib, mono_defaults.string_token, len);
+       g_assert (ca != NULL);
+       
+       ((MonoStringObject *)s)->c_str = ca;
+       ((MonoStringObject *)s)->length = len;
+
+       memcpy (ca->vector, text, len * 2);
+
+       return s;
+}
+
+MonoObject *
+mono_new_string (const char *text)
+{
+       MonoObject *o;
+       guint16 *ut;
+       int i, l;
+
+       /* fixme: use some kind of unicode library here */
+
+       l = strlen (text);
+       ut = g_malloc (l*2);
+
+       for (i = 0; i < l; i++)
+               ut [i] = text[i];
+       
+       o = mono_new_utf16_string ((char *)ut, l);
+
+       g_free (ut);
 
        return o;
 }
+
+MonoObject *
+mono_value_box (MonoClass *class, gpointer val)
+{
+       MonoObject *res;
+       int size;
+
+       g_assert (class->valuetype);
+
+       res = mono_object_allocate (class->instance_size);
+       res->klass = class;
+
+       size = res->klass->instance_size - sizeof (MonoObject);
+
+       memcpy ((char *)res + sizeof (MonoObject), val, size);
+
+       return res;
+}
+
+gboolean
+mono_object_isinst (MonoObject *obj, MonoClass *klass)
+{
+       MonoClass *oklass = obj->klass;
+
+       while (oklass) {
+               if (oklass == klass)
+                       return TRUE;
+               oklass = oklass->parent;
+       }
+       return FALSE;
+}
+