Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / metadata / mono-mlist.c
index a7543b50f851ec194734d38cd5c576bf9ad65d40..cf67e7fd15b8685f6bd1f05634215eeb419168a2 100644 (file)
@@ -1,15 +1,23 @@
-/*
- * mono-mlist.c: Managed object list implementation
+/**
+ * \file
+ * Managed object list implementation
  *
  * Author:
  *   Paolo Molaro (lupus@ximian.com)
  *
  * Copyright 2006-2009 Novell, Inc (http://www.novell.com)
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
  */
 
 #include "mono/metadata/mono-mlist.h"
 #include "mono/metadata/appdomain.h"
 #include "mono/metadata/class-internals.h"
+#include "mono/metadata/object-internals.h"
+
+
+static
+MonoMList*  mono_mlist_alloc_checked       (MonoObject *data, MonoError *error);
+
 
 /* matches the System.MonoListItem object*/
 struct _MonoMList {
@@ -26,9 +34,8 @@ static MonoVTable *monolist_item_vtable = NULL;
 
 /**
  * mono_mlist_alloc:
- * @data: object to use as data
- *
- * Allocates a new managed list node with @data as the contents.
+ * \param data object to use as data
+ * Allocates a new managed list node with \p data as the contents.
  * A managed list node also represents a singly-linked list.
  * Managed lists are garbage collected, so there is no free routine
  * and the user is required to keep references to the managed list
@@ -37,22 +44,43 @@ static MonoVTable *monolist_item_vtable = NULL;
 MonoMList*
 mono_mlist_alloc (MonoObject *data)
 {
+       MonoError error;
+       MonoMList *result = mono_mlist_alloc_checked (data, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
+
+/**
+ * mono_mlist_alloc_checked:
+ * \param data object to use as data
+ * \param error set on error
+ * Allocates a new managed list node with \p data as the contents.  A
+ * managed list node also represents a singly-linked list.  Managed
+ * lists are garbage collected, so there is no free routine and the
+ * user is required to keep references to the managed list to prevent
+ * it from being garbage collected. On failure returns NULL and sets
+ * \p error.
+ */
+MonoMList*
+mono_mlist_alloc_checked (MonoObject *data, MonoError *error)
+{
+       error_init (error);
        MonoMList* res;
        if (!monolist_item_vtable) {
-               MonoClass *klass = mono_class_from_name (mono_defaults.corlib, "System", "MonoListItem");
+               MonoClass *klass = mono_class_load_from_name (mono_defaults.corlib, "System", "MonoListItem");
                monolist_item_vtable = mono_class_vtable (mono_get_root_domain (), klass);
                g_assert (monolist_item_vtable);
        }
-       res = (MonoMList*)mono_object_new_fast (monolist_item_vtable);
+       res = (MonoMList*)mono_object_new_specific_checked (monolist_item_vtable, error);
+       return_val_if_nok (error, NULL);
        MONO_OBJECT_SETREF (res, data, data);
        return res;
 }
 
 /**
  * mono_mlist_get_data:
- * @list: the managed list node
- *
- * Get the object stored in the list node @list.
+ * \param list the managed list node
+ * Get the object stored in the list node \p list.
  */
 MonoObject*
 mono_mlist_get_data (MonoMList* list)
@@ -62,9 +90,8 @@ mono_mlist_get_data (MonoMList* list)
 
 /**
  * mono_mlist_set_data:
- * @list: the managed list node
- *
- * Set the object content in the list node @list.
+ * \param list the managed list node
+ * Set the object content in the list node \p list.
  */
 void
 mono_mlist_set_data (MonoMList* list, MonoObject *data)
@@ -74,10 +101,9 @@ mono_mlist_set_data (MonoMList* list, MonoObject *data)
 
 /**
  * mono_mlist_set_next:
- * @list: a managed list node
- * @next: list node that will be next for the @list node.
- *
- * Set next node for @list to @next.
+ * \param list a managed list node
+ * \param next list node that will be next for the \p list node.
+ * Set next node for \p list to \p next.
  */
 MonoMList *
 mono_mlist_set_next (MonoMList* list, MonoMList *next)
@@ -91,9 +117,8 @@ mono_mlist_set_next (MonoMList* list, MonoMList *next)
 
 /**
  * mono_mlist_length:
- * @list: the managed list
- *
- * Get the number of items in the list @list.
+ * \param list the managed list
+ * Get the number of items in the list \p list.
  * Since managed lists are singly-linked, this operation takes O(n) time.
  */
 int
@@ -109,9 +134,8 @@ mono_mlist_length (MonoMList* list)
 
 /**
  * mono_mlist_next:
- * @list: the managed list node
- *
- * Returns the next managed list node starting from @list.
+ * \param list the managed list node
+ * Returns the next managed list node starting from \p list.
  */
 MonoMList*
 mono_mlist_next (MonoMList* list)
@@ -121,9 +145,8 @@ mono_mlist_next (MonoMList* list)
 
 /**
  * mono_mlist_last:
- * @list: the managed list node
- *
- * Returns the last managed list node in list @list.
+ * \param list the managed list node
+ * Returns the last managed list node in list \p list.
  * Since managed lists are singly-linked, this operation takes O(n) time.
  */
 MonoMList*
@@ -139,16 +162,36 @@ mono_mlist_last (MonoMList* list)
 
 /**
  * mono_mlist_prepend:
- * @list: the managed list
- * @data: the object to add to the list
- *
- * Allocate a new list node with @data as content and prepend it
- * to the list @list. @list can be NULL.
+ * \param list the managed list
+ * \param data the object to add to the list
+ * Allocate a new list node with \p data as content and prepend it
+ * to the list \p list. \p list can be NULL.
  */
 MonoMList*
 mono_mlist_prepend (MonoMList* list, MonoObject *data)
 {
-       MonoMList* res = mono_mlist_alloc (data);
+       MonoError error;
+       MonoMList *result = mono_mlist_prepend_checked (list, data, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
+
+/**
+ * mono_mlist_prepend_checked:
+ * \param list the managed list
+ * \param data the object to add to the list
+ * \param error set on error
+ * Allocate a new list node with \p data as content and prepend it to
+ * the list \p list. \p list can be NULL. On failure returns NULL and sets
+ * \p error.
+ */
+MonoMList*
+mono_mlist_prepend_checked (MonoMList* list, MonoObject *data, MonoError *error)
+{
+       error_init (error);
+       MonoMList* res = mono_mlist_alloc_checked (data, error);
+       return_val_if_nok (error, NULL);
+
        if (list)
                MONO_OBJECT_SETREF (res, next, list);
        return res;
@@ -156,17 +199,38 @@ mono_mlist_prepend (MonoMList* list, MonoObject *data)
 
 /**
  * mono_mlist_append:
- * @list: the managed list
- * @data: the object to add to the list
- *
- * Allocate a new list node with @data as content and append it
- * to the list @list. @list can be NULL.
+ * \param list the managed list
+ * \param data the object to add to the list
+ * Allocate a new list node with \p data as content and append it
+ * to the list \p list. \p list can be NULL.
  * Since managed lists are singly-linked, this operation takes O(n) time.
  */
 MonoMList*
 mono_mlist_append (MonoMList* list, MonoObject *data)
 {
-       MonoMList* res = mono_mlist_alloc (data);
+       MonoError error;
+       MonoMList *result = mono_mlist_append_checked (list, data, &error);
+       mono_error_cleanup (&error);
+       return result;
+}
+
+/**
+ * mono_mlist_append_checked:
+ * \param list the managed list
+ * \param data the object to add to the list
+ * \param error set on error
+ * Allocate a new list node with \p data as content and append it
+ * to the list \p list. \p list can be NULL.
+ * Since managed lists are singly-linked, this operation takes O(n) time.
+ * On failure returns NULL and sets \p error.
+ */
+MonoMList*
+mono_mlist_append_checked (MonoMList* list, MonoObject *data, MonoError *error)
+{
+       error_init (error);
+       MonoMList* res = mono_mlist_alloc_checked (data, error);
+       return_val_if_nok (error, NULL);
+
        if (list) {
                MonoMList* last = mono_mlist_last (list);
                MONO_OBJECT_SETREF (last, next, res);
@@ -191,10 +255,9 @@ find_prev (MonoMList* list, MonoMList *item)
 
 /**
  * mono_mlist_remove_item:
- * @list: the managed list
- * @data: the object to remove from the list
- *
- * Remove the list node @item from the managed list @list.
+ * \param list the managed list
+ * \param data the object to remove from the list
+ * Remove the list node \p item from the managed list \p list.
  * Since managed lists are singly-linked, this operation can take O(n) time.
  */
 MonoMList*