[macruby-changes] [3592] MacRuby/trunk/dispatcher.cpp

source_changes at macosforge.org source_changes at macosforge.org
Tue Feb 23 07:23:08 PST 2010


Revision: 3592
          http://trac.macosforge.org/projects/ruby/changeset/3592
Author:   martinlagardette at apple.com
Date:     2010-02-23 07:23:07 -0800 (Tue, 23 Feb 2010)
Log Message:
-----------

 - Add an arity check for bridgesupport functions:
  - Avoid a crash when calling with too few arguments
  - Raise with too many arguments
 - Improve error message when calling a native Obj-C method with no argument:
  - Display number of missing argument(s) instead of raising `NoMethodError`

Modified Paths:
--------------
    MacRuby/trunk/dispatcher.cpp

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2010-02-23 11:57:49 UTC (rev 3591)
+++ MacRuby/trunk/dispatcher.cpp	2010-02-23 15:23:07 UTC (rev 3592)
@@ -700,6 +700,12 @@
 	    std::string name(selname, selname_len);
 	    bs_element_function_t *bs_func = GET_CORE()->find_bs_function(name);
 	    if (bs_func != NULL) {
+		if ((unsigned)argc < bs_func->args_count
+			|| ((unsigned)argc > bs_func->args_count
+				&& bs_func->variadic == false)) {
+		    rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
+			argc, bs_func->args_count);
+		}
 		std::string types;
 		vm_gen_bs_func_types(argc, argv, bs_func, types);
 
@@ -929,11 +935,17 @@
     if (new_sel != 0) {
 	Method m = class_getInstanceMethod(klass, new_sel);
 	if (m != NULL) {
+	    unsigned expected_argc;
 	    rb_vm_method_node_t *node = GET_CORE()->method_node_get(m);
 	    if (node != NULL) {
-		rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
-			 argc, node->arity.min);
+		expected_argc = node->arity.min;
 	    }
+	    else {
+		expected_argc = method_getNumberOfArguments(m);
+		expected_argc -= 2; // removing receiver and selector
+	    }
+	    rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
+		     argc, expected_argc);
 	}
     }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100223/9efad1ab/attachment.html>


More information about the macruby-changes mailing list