[前][次][番号順一覧][スレッド一覧]

ruby-changes:39286

From: ko1 <ko1@a...>
Date: Sat, 25 Jul 2015 05:58:32 +0900 (JST)
Subject: [ruby-changes:39286] ko1:r51367 (trunk): * vm_core.h: constify rb_iseq_constant_body::param::opt_table and

ko1	2015-07-25 05:58:09 +0900 (Sat, 25 Jul 2015)

  New Revision: 51367

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=51367

  Log:
    * vm_core.h: constify rb_iseq_constant_body::param::opt_table and
      rb_iseq_constant_body::param::keyword.
    * compile.c: catch up this fix.

  Modified files:
    trunk/ChangeLog
    trunk/compile.c
    trunk/vm_core.h
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 51366)
+++ ChangeLog	(revision 51367)
@@ -1,3 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Sat Jul 25 05:56:43 2015  Koichi Sasada  <ko1@a...>
+
+	* vm_core.h: constify rb_iseq_constant_body::param::opt_table and
+	  rb_iseq_constant_body::param::keyword.
+
+	* compile.c: catch up this fix.
+
 Sat Jul 25 04:47:01 2015  Koichi Sasada  <ko1@a...>
 
 	* vm_core.h: constify rb_iseq_constant_body::catch_table.
Index: vm_core.h
===================================================================
--- vm_core.h	(revision 51366)
+++ vm_core.h	(revision 51367)
@@ -302,7 +302,7 @@ struct rb_iseq_constant_body { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L302
 	int post_num;
 	int block_start;
 
-	VALUE *opt_table; /* (opt_num + 1) entries. */
+	const VALUE *opt_table; /* (opt_num + 1) entries. */
 	/* opt_num and opt_table:
 	 *
 	 * def foo o1=e1, o2=e2, ..., oN=eN
@@ -317,7 +317,7 @@ struct rb_iseq_constant_body { https://github.com/ruby/ruby/blob/trunk/vm_core.h#L317
 	 * opt_table = [A1, A2, ..., AN, AL]
 	 */
 
-	struct rb_iseq_param_keyword {
+	const struct rb_iseq_param_keyword {
 	    int num;
 	    int required_num;
 	    int bits_start;
Index: compile.c
===================================================================
--- compile.c	(revision 51366)
+++ compile.c	(revision 51367)
@@ -1162,6 +1162,76 @@ iseq_calc_param_size(rb_iseq_t *iseq) https://github.com/ruby/ruby/blob/trunk/compile.c#L1162
     }
 }
 
+static void
+iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *optargs, const struct rb_args_info *args)
+{
+    NODE *node = args->kw_args;
+    struct rb_iseq_param_keyword *keyword;
+    const VALUE default_values = rb_ary_tmp_new(1);
+    const VALUE complex_mark = rb_str_tmp_new(0);
+    int kw = 0, rkw = 0, di = 0, i;
+
+    iseq->body->param.flags.has_kw = TRUE;
+    iseq->body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
+    keyword->bits_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_vid);
+
+    while (node) {
+	NODE *val_node = node->nd_body->nd_value;
+	VALUE dv;
+
+	if (val_node == (NODE *)-1) {
+	    ++rkw;
+	}
+	else {
+	    switch (nd_type(val_node)) {
+	      case NODE_LIT:
+		dv = val_node->nd_lit;
+		iseq_add_mark_object(iseq, dv);
+		break;
+	      case NODE_NIL:
+		dv = Qnil;
+		break;
+	      case NODE_TRUE:
+		dv = Qtrue;
+		break;
+	      case NODE_FALSE:
+		dv = Qfalse;
+		break;
+	      default:
+		COMPILE_POPED(optargs, "kwarg", node); /* nd_type(node) == NODE_KW_ARG */
+		dv = complex_mark;
+	    }
+
+	    keyword->num = ++di;
+	    rb_ary_push(default_values, dv);
+	}
+
+	kw++;
+	node = node->nd_next;
+    }
+
+    keyword->num = kw;
+
+    if (args->kw_rest_arg->nd_cflag != 0) {
+	keyword->rest_start =  get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_cflag);
+	iseq->body->param.flags.has_kwrest = TRUE;
+    }
+    keyword->required_num = rkw;
+    keyword->table = &iseq->body->local_table[keyword->bits_start - keyword->num];
+
+    {
+	VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values));
+
+	for (i = 0; i < RARRAY_LEN(default_values); i++) {
+	    VALUE dv = RARRAY_AREF(default_values, i);
+	    if (dv == complex_mark) dv = Qundef;
+	    dvs[i] = dv;
+	}
+
+	keyword->default_values = dvs;
+    }
+}
+
 static int
 iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node_args)
 {
@@ -1200,6 +1270,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L1270
 	    NODE *node = args->opt_args;
 	    LABEL *label;
 	    VALUE labels = rb_ary_tmp_new(1);
+	    VALUE *opt_table;
 	    int i = 0, j;
 
 	    while (node) {
@@ -1216,87 +1287,27 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK https://github.com/ruby/ruby/blob/trunk/compile.c#L1287
 	    rb_ary_push(labels, (VALUE)label | 1);
 	    ADD_LABEL(optargs, label);
 
-	    iseq->body->param.opt_num = i;
-	    iseq->body->param.opt_table = ALLOC_N(VALUE, i+1);
-	    MEMCPY(iseq->body->param.opt_table, RARRAY_CONST_PTR(labels), VALUE, i+1);
+	    opt_table = ALLOC_N(VALUE, i+1);
+
+	    MEMCPY(opt_table, RARRAY_CONST_PTR(labels), VALUE, i+1);
 	    for (j = 0; j < i+1; j++) {
-		iseq->body->param.opt_table[j] &= ~1;
+		opt_table[j] &= ~1;
 	    }
 	    rb_ary_clear(labels);
 
 	    iseq->body->param.flags.has_opt = TRUE;
+	    iseq->body->param.opt_num = i;
+	    iseq->body->param.opt_table = opt_table;
 	}
 
 	if (args->kw_args) {
-	    NODE *node = args->kw_args;
-	    const VALUE default_values = rb_ary_tmp_new(1);
-	    const VALUE complex_mark = rb_str_tmp_new(0);
-	    int kw = 0, rkw = 0, di = 0, i;
-
-	    iseq->body->param.flags.has_kw = TRUE;
-	    iseq->body->param.keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
-	    iseq->body->param.keyword->bits_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_vid);
-
-	    while (node) {
-		NODE *val_node = node->nd_body->nd_value;
-		VALUE dv;
-
-		if (val_node == (NODE *)-1) {
-		    ++rkw;
-		}
-		else {
-		    switch (nd_type(val_node)) {
-		      case NODE_LIT:
-			dv = val_node->nd_lit;
-			iseq_add_mark_object(iseq, dv);
-			break;
-		      case NODE_NIL:
-			dv = Qnil;
-			break;
-		      case NODE_TRUE:
-			dv = Qtrue;
-			break;
-		      case NODE_FALSE:
-			dv = Qfalse;
-			break;
-		      default:
-			COMPILE_POPED(optargs, "kwarg", node); /* nd_type(node) == NODE_KW_ARG */
-			dv = complex_mark;
-		    }
-
-		    iseq->body->param.keyword->num = ++di;
-		    rb_ary_push(default_values, dv);
-		}
-
-		kw++;
-		node = node->nd_next;
-	    }
-
-	    iseq->body->param.keyword->num = kw;
-
-	    if (args->kw_rest_arg->nd_cflag != 0) {
-		iseq->body->param.keyword->rest_start =  get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_cflag);
-		iseq->body->param.flags.has_kwrest = TRUE;
-	    }
-	    iseq->body->param.keyword->required_num = rkw;
-	    iseq->body->param.keyword->table = &iseq->body->local_table[iseq->body->param.keyword->bits_start - iseq->body->param.keyword->num];
-
-	    {
-		VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values));
-
-		for (i = 0; i < RARRAY_LEN(default_values); i++) {
-		    VALUE dv = RARRAY_AREF(default_values, i);
-		    if (dv == complex_mark) dv = Qundef;
-		    dvs[i] = dv;
-		}
-
-		iseq->body->param.keyword->default_values = dvs;
-	    }
+	    iseq_set_arguments_keywords(iseq, optargs, args);
 	}
 	else if (args->kw_rest_arg) {
+	    struct rb_iseq_param_keyword *keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
+	    keyword->rest_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_vid);
+	    iseq->body->param.keyword = keyword;
 	    iseq->body->param.flags.has_kwrest = TRUE;
-	    iseq->body->param.keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
-	    iseq->body->param.keyword->rest_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_vid);
 	}
 
 	if (args->pre_init) { /* m_init */
@@ -1771,10 +1782,11 @@ static int https://github.com/ruby/ruby/blob/trunk/compile.c#L1782
 iseq_set_optargs_table(rb_iseq_t *iseq)
 {
     int i;
+    VALUE *opt_table = (VALUE *)iseq->body->param.opt_table;
 
     if (iseq->body->param.flags.has_opt) {
 	for (i = 0; i < iseq->body->param.opt_num + 1; i++) {
-	    iseq->body->param.opt_table[i] = label_get_position((LABEL *)iseq->body->param.opt_table[i]);
+	    opt_table[i] = label_get_position((LABEL *)opt_table[i]);
 	}
     }
     return COMPILE_OK;
@@ -6081,7 +6093,7 @@ int_param(int *dst, VALUE param, VALUE s https://github.com/ruby/ruby/blob/trunk/compile.c#L6093
     return FALSE;
 }
 
-static void
+static const struct rb_iseq_param_keyword *
 iseq_build_kw(rb_iseq_t *iseq, VALUE params, VALUE keywords)
 {
     int i, j;
@@ -6090,14 +6102,14 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE par https://github.com/ruby/ruby/blob/trunk/compile.c#L6102
     VALUE key, sym, default_val;
     VALUE *dvs;
     ID *ids;
+    struct rb_iseq_param_keyword *keyword = ZALLOC(struct rb_iseq_param_keyword);
 
     iseq->body->param.flags.has_kw = TRUE;
 
-    iseq->body->param.keyword = ZALLOC(struct rb_iseq_param_keyword);
-    iseq->body->param.keyword->num = len;
+    keyword->num = len;
 #define SYM(s) ID2SYM(rb_intern(#s))
-    (void)int_param(&iseq->body->param.keyword->bits_start, params, SYM(kwbits));
-    i = iseq->body->param.keyword->bits_start - iseq->body->param.keyword->num;
+    (void)int_param(&keyword->bits_start, params, SYM(kwbits));
+    i = keyword->bits_start - keyword->num;
     ids = (VALUE *)&iseq->body->local_table[i];
 #undef SYM
 
@@ -6109,13 +6121,13 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE par https://github.com/ruby/ruby/blob/trunk/compile.c#L6121
 	    goto default_values;
 	}
 	ids[i] = SYM2ID(val);
-	iseq->body->param.keyword->required_num++;
+	keyword->required_num++;
     }
 
   default_values: /* note: we intentionally preserve `i' from previous loop */
     default_len = len - i;
     if (default_len == 0) {
-	return;
+	return keyword;
     }
 
     dvs = ALLOC_N(VALUE, default_len);
@@ -6134,16 +6146,16 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE par https://github.com/ruby/ruby/blob/trunk/compile.c#L6146
 	    default_val = RARRAY_AREF(key, 1);
 	    break;
 	  default:
-	    rb_raise(rb_eTypeError,
-		     "keyword default has unsupported len %+"PRIsVALUE,
-		     key);
+	    rb_raise(rb_eTypeError, "keyword default has unsupported len %+"PRIsVALUE, key);
 	}
 	ids[i] = SYM2ID(sym);
 	dvs[j] = default_val;
     }
 
-    iseq->body->param.keyword->table = ids;
-    iseq->body->param.keyword->default_values = dvs;
+    keyword->table = ids;
+    keyword->default_values = dvs;
+
+    return keyword;
 }
 
 void
@@ -6197,15 +6209,16 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L6209
 	iseq->body->param.flags.has_opt = !!(len - 1 >= 0);
 
 	if (iseq->body->param.flags.has_opt) {
-	    iseq->body->param.opt_num = len - 1;
-	    iseq->body->param.opt_table = (VALUE *)ALLOC_N(VALUE, len);
+	    VALUE *opt_table = ALLOC_N(VALUE, len);
 
 	    for (i = 0; i < len; i++) {
 		VALUE ent = RARRAY_AREF(arg_opt_labels, i);
 		LABEL *label = register_label(iseq, labels_table, ent);
-
-		iseq->body->param.opt_table[i] = (VALUE)label;
+		opt_table[i] = (VALUE)label;
 	    }
+
+	    iseq->body->param.opt_num = len - 1;
+	    iseq->body->param.opt_table = opt_table;
 	}
       case T_NIL:
 	break;
@@ -6216,7 +6229,7 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L6229
 
     switch (TYPE(keywords)) {
       case T_ARRAY:
-	iseq_build_kw(iseq, params, keywords);
+	iseq->body->param.keyword = iseq_build_kw(iseq, params, keywords);
       case T_NIL:
 	break;
       default:
@@ -6229,12 +6242,12 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, https://github.com/ruby/ruby/blob/trunk/compile.c#L6242
     }
 
     if (int_param(&i, params, SYM(kwrest))) {
-        if (!iseq->body->param.keyword) {
-          iseq->body->param.keyword = ZALLOC(struct rb_iseq_param_keyword);
-        }
-        iseq->body->param.keyword->rest_start = i;
-        iseq->body->param.flags.has_kwrest = TRUE;
-
+	struct rb_iseq_param_keyword *keyword = (struct rb_iseq_param_keyword *)iseq->body->param.keyword;
+	if (keyword == NULL) {
+	    iseq->body->param.keyword = keyword = ZALLOC(struct rb_iseq_param_keyword);
+	}
+	keyword->rest_start = i;
+	iseq->body->param.flags.has_kwrest = TRUE;
     }
 #undef SYM
     iseq_calc_param_size(iseq);

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]