Revision
4498
Author
lsansonetti@apple.com
Date
2010-09-08 18:36:41 -0700 (Wed, 08 Sep 2010)

Log Message

ignore elements nesting function_pointers (instead of raising an exception)

Modified Paths

Diff

Modified: MacRuby/trunk/bs.c (4497 => 4498)


--- MacRuby/trunk/bs.c	2010-09-08 04:20:03 UTC (rev 4497)
+++ MacRuby/trunk/bs.c	2010-09-09 01:36:41 UTC (rev 4498)
@@ -447,6 +447,7 @@
   bs_element_function_pointer_t *func_ptr;
   bool success;
   CFStringRef cf_path;
+  bool nested_func_ptr;
 
   if (callback == NULL)
     return false;
@@ -508,12 +509,12 @@
 
   func = NULL;
   func_ptr = NULL;
+  func_ptr_arg_depth = -1;
+  nested_func_ptr = false;
   klass = NULL;
   method = NULL;
   protocol_name = NULL;
 
-  func_ptr_arg_depth = -1;
-
   while (true) {
     const char *name;
     unsigned int namelen;
@@ -545,11 +546,21 @@
 
     bs_element = NULL;
 
+    atom = bs_xml_element(name, namelen);
+    if (atom == NULL)
+      continue;
+
+    if (nested_func_ptr) {
+      // FIXME: elements nesting function_pointers aren't supported yet by the
+      // parser, so we just ignore them.
+      if (node_type == XML_READER_TYPE_END_ELEMENT
+          && (atom->val == BS_XML_FUNCTION || atom->val == BS_XML_METHOD)) {
+        nested_func_ptr = false;
+      }
+      continue;
+    }
+
     if (node_type == XML_READER_TYPE_ELEMENT) {
-      atom = bs_xml_element(name, namelen);
-      if (atom == NULL)
-        continue;
-
       switch (atom->val) {
         case BS_XML_DEPENDS_ON:
         {
@@ -912,8 +923,11 @@
             bs_arg->type = get_type_attribute(reader);
 
             if (get_boolean_attribute(reader, "function_pointer", false)) {
-              if (func_ptr != NULL) /* FIXME */
-                BAIL("internal error, nested function pointers detected");
+              if (func_ptr != NULL) {
+                func_ptr = NULL; 
+		nested_func_ptr = true;
+		break;
+	      }
               bs_arg->function_pointer = (bs_element_function_pointer_t *)
                 calloc(1, sizeof(bs_element_function_pointer_t));
               ASSERT_ALLOC(bs_arg->function_pointer);
@@ -995,8 +1009,11 @@
             }
 
             if (get_boolean_attribute(reader, "function_pointer", false)) {
-              if (func_ptr != NULL) /* FIXME */
-                BAIL("internal error, nested function pointers detected");
+              if (func_ptr != NULL) {
+                func_ptr = NULL; 
+		nested_func_ptr = true;
+		break;
+              }
               bs_retval->function_pointer = (bs_element_function_pointer_t *)
                 calloc(1, sizeof(bs_element_function_pointer_t));
               ASSERT_ALLOC(bs_retval->function_pointer);
@@ -1075,10 +1092,6 @@
       }
     }
     else if (node_type == XML_READER_TYPE_END_ELEMENT) {
-      atom = bs_xml_element(name, namelen);
-      if (atom == NULL)
-        continue;
-
       switch (atom->val) {
         case BS_XML_INFORMAL_PROTOCOL: 
         {