mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* refactoring CREF related code.
* eval_intern.h: remove unused setter functions. CREF_CLASS_SET() CREF_NEXT_SET() CREF_SCOPE_VISI_COPY() * eval_intern.h: rename flags: * NODE_FL_CREF_PUSHED_BY_EVAL_ -> CREF_FL_PUSHED_BY_EVAL * NODE_FL_CREF_OMOD_SHARED_ -> CREF_FL_OMOD_SHARED and use IMEMO_FL_USER1/2. * vm.c (vm_cref_new): accept push_by_eval parameter. * vm.c (vm_cref_new_use_prev): added for rb_vm_rewrite_cref(). * vm_insnhelper.c (vm_cref_push): accept pushed_by_eval parameter. * vm_insnhelper.h: remove unused macros: COPY_CREF_OMOD() and COPY_CREF(). * vm_eval.c, insns.def: catch up this fix. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@52564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									b73e900f50
								
							
						
					
					
						commit
						32a9647264
					
				
					 7 changed files with 93 additions and 87 deletions
				
			
		
							
								
								
									
										25
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								ChangeLog
									
										
									
									
									
								
							|  | @ -1,3 +1,28 @@ | |||
| Sat Nov 14 04:55:36 2015  Koichi Sasada  <ko1@atdot.net> | ||||
| 
 | ||||
| 	* refactoring CREF related code. | ||||
| 
 | ||||
| 	* eval_intern.h: remove unused setter functions. | ||||
| 	  CREF_CLASS_SET() | ||||
| 	  CREF_NEXT_SET() | ||||
| 	  CREF_SCOPE_VISI_COPY() | ||||
| 
 | ||||
| 	* eval_intern.h: rename flags: | ||||
| 	  * NODE_FL_CREF_PUSHED_BY_EVAL_ -> CREF_FL_PUSHED_BY_EVAL | ||||
| 	  * NODE_FL_CREF_OMOD_SHARED_ -> CREF_FL_OMOD_SHARED | ||||
| 	  and use IMEMO_FL_USER1/2. | ||||
| 
 | ||||
| 	* vm.c (vm_cref_new): accept push_by_eval parameter. | ||||
| 
 | ||||
| 	* vm.c (vm_cref_new_use_prev): added for rb_vm_rewrite_cref(). | ||||
| 
 | ||||
| 	* vm_insnhelper.c (vm_cref_push): accept pushed_by_eval parameter. | ||||
| 
 | ||||
| 	* vm_insnhelper.h: remove unused macros: | ||||
| 	  COPY_CREF_OMOD() and COPY_CREF(). | ||||
| 
 | ||||
| 	* vm_eval.c, insns.def: catch up this fix. | ||||
| 
 | ||||
| Sat Nov 14 02:58:03 2015  Koichi Sasada  <ko1@atdot.net> | ||||
| 
 | ||||
| 	* vm.c (vm_define_method): refactoring. | ||||
|  |  | |||
|  | @ -179,8 +179,8 @@ rb_threadptr_tag_jump(rb_thread_t *th, int st) | |||
| 
 | ||||
| /* CREF operators */ | ||||
| 
 | ||||
| #define NODE_FL_CREF_PUSHED_BY_EVAL_ (((VALUE)1)<<15) | ||||
| #define NODE_FL_CREF_OMOD_SHARED_    (((VALUE)1)<<16) | ||||
| #define CREF_FL_PUSHED_BY_EVAL IMEMO_FL_USER1 | ||||
| #define CREF_FL_OMOD_SHARED    IMEMO_FL_USER2 | ||||
| 
 | ||||
| static inline VALUE | ||||
| CREF_CLASS(const rb_cref_t *cref) | ||||
|  | @ -188,40 +188,18 @@ CREF_CLASS(const rb_cref_t *cref) | |||
|     return cref->klass; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| CREF_CLASS_SET(rb_cref_t *cref, VALUE klass) | ||||
| { | ||||
|     RB_OBJ_WRITE(cref, &cref->klass, klass); | ||||
| } | ||||
| 
 | ||||
| static inline rb_cref_t * | ||||
| CREF_NEXT(const rb_cref_t *cref) | ||||
| { | ||||
|     return cref->next; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| CREF_NEXT_SET(rb_cref_t *cref, const rb_cref_t *next_cref) | ||||
| { | ||||
|     RB_OBJ_WRITE(cref, &cref->next, next_cref); | ||||
| } | ||||
| 
 | ||||
| static inline const rb_scope_visibility_t * | ||||
| CREF_SCOPE_VISI(const rb_cref_t *cref) | ||||
| { | ||||
|     return &cref->scope_visi; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| CREF_SCOPE_VISI_COPY(rb_cref_t *dst_cref, const rb_cref_t *src_cref) | ||||
| { | ||||
|     const rb_scope_visibility_t *src = &src_cref->scope_visi; | ||||
|     rb_scope_visibility_t *dst = (rb_scope_visibility_t *)&dst_cref->scope_visi; /* OK for const cast */ | ||||
| 
 | ||||
|     dst->method_visi = src->method_visi; | ||||
|     dst->module_func = src->module_func; | ||||
| } | ||||
| 
 | ||||
| static inline VALUE | ||||
| CREF_REFINEMENTS(const rb_cref_t *cref) | ||||
| { | ||||
|  | @ -237,31 +215,31 @@ CREF_REFINEMENTS_SET(rb_cref_t *cref, VALUE refs) | |||
| static inline int | ||||
| CREF_PUSHED_BY_EVAL(const rb_cref_t *cref) | ||||
| { | ||||
|     return cref->flags & NODE_FL_CREF_PUSHED_BY_EVAL_; | ||||
|     return cref->flags & CREF_FL_PUSHED_BY_EVAL; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| CREF_PUSHED_BY_EVAL_SET(rb_cref_t *cref) | ||||
| { | ||||
|     cref->flags |= NODE_FL_CREF_PUSHED_BY_EVAL_; | ||||
|     cref->flags |= CREF_FL_PUSHED_BY_EVAL; | ||||
| } | ||||
| 
 | ||||
| static inline int | ||||
| CREF_OMOD_SHARED(const rb_cref_t *cref) | ||||
| { | ||||
|     return cref->flags & NODE_FL_CREF_OMOD_SHARED_; | ||||
|     return cref->flags & CREF_FL_OMOD_SHARED; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| CREF_OMOD_SHARED_SET(rb_cref_t *cref) | ||||
| { | ||||
|     cref->flags |= NODE_FL_CREF_OMOD_SHARED_; | ||||
|     cref->flags |= CREF_FL_OMOD_SHARED; | ||||
| } | ||||
| 
 | ||||
| static inline void | ||||
| CREF_OMOD_SHARED_UNSET(rb_cref_t *cref) | ||||
| { | ||||
|     cref->flags &= ~NODE_FL_CREF_OMOD_SHARED_; | ||||
|     cref->flags &= ~CREF_FL_OMOD_SHARED; | ||||
| } | ||||
| 
 | ||||
| void rb_thread_cleanup(void); | ||||
|  |  | |||
|  | @ -914,7 +914,7 @@ defineclass | |||
|     /* enter scope */ | ||||
|     vm_push_frame(th, class_iseq, VM_FRAME_MAGIC_CLASS, klass, | ||||
| 		  VM_ENVVAL_BLOCK_PTR(GET_BLOCK_PTR()), | ||||
| 		  (VALUE)vm_cref_push(th, klass, NULL), | ||||
| 		  (VALUE)vm_cref_push(th, klass, NULL, FALSE), | ||||
| 		  class_iseq->body->iseq_encoded, GET_SP(), | ||||
| 		  class_iseq->body->local_size, class_iseq->body->stack_max); | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										58
									
								
								vm.c
									
										
									
									
									
								
							
							
						
						
									
										58
									
								
								vm.c
									
										
									
									
									
								
							|  | @ -86,25 +86,69 @@ rb_vm_control_frame_block_ptr(const rb_control_frame_t *cfp) | |||
| } | ||||
| 
 | ||||
| static rb_cref_t * | ||||
| vm_cref_new(VALUE klass, rb_method_visibility_t visi, const rb_cref_t *prev_cref) | ||||
| vm_cref_new0(VALUE klass, rb_method_visibility_t visi, int module_func, rb_cref_t *prev_cref, int pushed_by_eval, int use_prev_prev) | ||||
| { | ||||
|     VALUE refinements = Qnil; | ||||
|     int omod_shared = FALSE; | ||||
|      rb_cref_t *cref; | ||||
| 
 | ||||
|     /* scope */ | ||||
|     union { | ||||
| 	rb_scope_visibility_t visi; | ||||
| 	VALUE value; | ||||
|     } scope_visi; | ||||
|     scope_visi.visi.method_visi = visi; | ||||
|     scope_visi.visi.module_func = 0; | ||||
| 
 | ||||
|     return (rb_cref_t *)rb_imemo_new(imemo_cref, klass, (VALUE)prev_cref, scope_visi.value, Qnil); | ||||
|     scope_visi.visi.method_visi = visi; | ||||
|     scope_visi.visi.module_func = module_func; | ||||
| 
 | ||||
|     /* refinements */ | ||||
|     if (prev_cref != NULL && prev_cref != (void *)1 /* TODO: why CREF_NEXT(cref) is 1? */) { | ||||
| 	refinements = CREF_REFINEMENTS(prev_cref); | ||||
| 
 | ||||
| 	if (!NIL_P(refinements)) { | ||||
| 	    omod_shared = TRUE; | ||||
| 	    CREF_OMOD_SHARED_SET(prev_cref); | ||||
| 	} | ||||
|     } | ||||
| 
 | ||||
|     cref = (rb_cref_t *)rb_imemo_new(imemo_cref, klass, (VALUE)(use_prev_prev ? CREF_NEXT(prev_cref) : prev_cref), scope_visi.value, refinements); | ||||
| 
 | ||||
|     if (pushed_by_eval) CREF_PUSHED_BY_EVAL_SET(cref); | ||||
|     if (omod_shared) CREF_OMOD_SHARED_SET(cref); | ||||
| 
 | ||||
|     return cref; | ||||
| } | ||||
| 
 | ||||
| static rb_cref_t * | ||||
| vm_cref_new(VALUE klass, rb_method_visibility_t visi, int module_func, rb_cref_t *prev_cref, int pushed_by_eval) | ||||
| { | ||||
|     return vm_cref_new0(klass, visi, module_func, prev_cref, pushed_by_eval, FALSE); | ||||
| } | ||||
| 
 | ||||
| static rb_cref_t * | ||||
| vm_cref_new_use_prev(VALUE klass, rb_method_visibility_t visi, int module_func, rb_cref_t *prev_cref, int pushed_by_eval) | ||||
| { | ||||
|     return vm_cref_new0(klass, visi, module_func, prev_cref, pushed_by_eval, TRUE); | ||||
| } | ||||
| 
 | ||||
| static rb_cref_t * | ||||
| vm_cref_dup(const rb_cref_t *cref) | ||||
| { | ||||
|     VALUE klass = CREF_CLASS(cref); | ||||
|     const rb_scope_visibility_t *visi = CREF_SCOPE_VISI(cref); | ||||
|     rb_cref_t *next_cref = CREF_NEXT(cref); | ||||
|     int pushed_by_eval = CREF_PUSHED_BY_EVAL(cref); | ||||
| 
 | ||||
|     return vm_cref_new(klass, visi->method_visi, visi->module_func, next_cref, pushed_by_eval); | ||||
| } | ||||
| 
 | ||||
| static rb_cref_t * | ||||
| vm_cref_new_toplevel(rb_thread_t *th) | ||||
| { | ||||
|     rb_cref_t *cref = vm_cref_new(rb_cObject, METHOD_VISI_PRIVATE /* toplevel visibility is private */, NULL); | ||||
|     rb_cref_t *cref = vm_cref_new(rb_cObject, METHOD_VISI_PRIVATE /* toplevel visibility is private */, FALSE, NULL, FALSE); | ||||
| 
 | ||||
|     if (th->top_wrapper) { | ||||
| 	cref = vm_cref_new(th->top_wrapper, METHOD_VISI_PRIVATE, cref); | ||||
| 	cref = vm_cref_new(th->top_wrapper, METHOD_VISI_PRIVATE, FALSE, cref, FALSE); | ||||
|     } | ||||
| 
 | ||||
|     return cref; | ||||
|  | @ -2844,7 +2888,7 @@ Init_VM(void) | |||
| 	th->cfp->pc = iseq->body->iseq_encoded; | ||||
| 	th->cfp->self = th->top_self; | ||||
| 
 | ||||
| 	th->cfp->ep[-1] = (VALUE)vm_cref_new(rb_cObject, METHOD_VISI_PRIVATE, NULL); | ||||
| 	th->cfp->ep[-1] = (VALUE)vm_cref_new(rb_cObject, METHOD_VISI_PRIVATE, FALSE, NULL, FALSE); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * The Binding of the top level scope | ||||
|  |  | |||
							
								
								
									
										19
									
								
								vm_eval.c
									
										
									
									
									
								
							
							
						
						
									
										19
									
								
								vm_eval.c
									
										
									
									
									
								
							|  | @ -1272,7 +1272,6 @@ eval_string_with_cref(VALUE self, VALUE src, VALUE scope, rb_cref_t *const cref_ | |||
|     volatile int parse_in_eval; | ||||
|     volatile int mild_compile_error; | ||||
|     rb_cref_t *orig_cref; | ||||
|     VALUE crefval; | ||||
|     volatile VALUE file; | ||||
|     volatile int line; | ||||
| 
 | ||||
|  | @ -1339,16 +1338,13 @@ eval_string_with_cref(VALUE self, VALUE src, VALUE scope, rb_cref_t *const cref_ | |||
| 	if (!cref && base_block->iseq) { | ||||
| 	    if (NIL_P(scope)) { | ||||
| 		orig_cref = rb_vm_get_cref(base_block->ep); | ||||
| 		cref = vm_cref_new(Qnil, METHOD_VISI_PUBLIC, NULL); | ||||
| 		crefval = (VALUE) cref; | ||||
| 		COPY_CREF(cref, orig_cref); | ||||
| 		cref = vm_cref_dup(orig_cref); | ||||
| 	    } | ||||
| 	    else { | ||||
| 		cref = rb_vm_get_cref(base_block->ep); | ||||
| 	    } | ||||
| 	} | ||||
| 	vm_set_eval_stack(th, iseq, cref, base_block); | ||||
| 	RB_GC_GUARD(crefval); | ||||
| 
 | ||||
| 	if (0) {		/* for debug */ | ||||
| 	    VALUE disasm = rb_iseq_disasm(iseq); | ||||
|  | @ -1595,8 +1591,7 @@ yield_under(VALUE under, VALUE self, VALUE values) | |||
| 	block.self = self; | ||||
| 	VM_CF_LEP(th->cfp)[0] = VM_ENVVAL_BLOCK_PTR(&block); | ||||
|     } | ||||
|     cref = vm_cref_push(th, under, blockptr); | ||||
|     CREF_PUSHED_BY_EVAL_SET(cref); | ||||
|     cref = vm_cref_push(th, under, blockptr, TRUE); | ||||
| 
 | ||||
|     if (values == Qundef) { | ||||
| 	return vm_yield_with_cref(th, 1, &self, cref); | ||||
|  | @ -1618,8 +1613,7 @@ rb_yield_refine_block(VALUE refinement, VALUE refinements) | |||
| 	block.self = refinement; | ||||
| 	VM_CF_LEP(th->cfp)[0] = VM_ENVVAL_BLOCK_PTR(&block); | ||||
|     } | ||||
|     cref = vm_cref_push(th, refinement, blockptr); | ||||
|     CREF_PUSHED_BY_EVAL_SET(cref); | ||||
|     cref = vm_cref_push(th, refinement, blockptr, TRUE); | ||||
|     CREF_REFINEMENTS_SET(cref, refinements); | ||||
| 
 | ||||
|     return vm_yield_with_cref(th, 0, NULL, cref); | ||||
|  | @ -1629,13 +1623,8 @@ rb_yield_refine_block(VALUE refinement, VALUE refinements) | |||
| static VALUE | ||||
| eval_under(VALUE under, VALUE self, VALUE src, VALUE file, int line) | ||||
| { | ||||
|     rb_cref_t *cref = vm_cref_push(GET_THREAD(), under, NULL); | ||||
| 
 | ||||
|     if (SPECIAL_CONST_P(self) && !NIL_P(under)) { | ||||
| 	CREF_PUSHED_BY_EVAL_SET(cref); | ||||
|     } | ||||
|     rb_cref_t *cref = vm_cref_push(GET_THREAD(), under, NULL, SPECIAL_CONST_P(self) && !NIL_P(under)); | ||||
|     SafeStringValue(src); | ||||
| 
 | ||||
|     return eval_string_with_cref(self, src, Qnil, cref, file, line); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -524,14 +524,11 @@ rb_vm_rewrite_cref(rb_cref_t *cref, VALUE old_klass, VALUE new_klass, rb_cref_t | |||
| 
 | ||||
|     while (cref) { | ||||
| 	if (CREF_CLASS(cref) == old_klass) { | ||||
| 	    new_cref = vm_cref_new(new_klass, METHOD_VISI_UNDEF, NULL); | ||||
| 	    COPY_CREF_OMOD(new_cref, cref); | ||||
| 	    CREF_NEXT_SET(new_cref, CREF_NEXT(cref)); | ||||
| 	    new_cref = vm_cref_new_use_prev(new_klass, METHOD_VISI_UNDEF, FALSE, cref, FALSE); | ||||
| 	    *new_cref_ptr = new_cref; | ||||
| 	    return; | ||||
| 	} | ||||
| 	new_cref = vm_cref_new(CREF_CLASS(cref), METHOD_VISI_UNDEF, NULL); | ||||
| 	COPY_CREF_OMOD(new_cref, cref); | ||||
| 	new_cref = vm_cref_new_use_prev(CREF_CLASS(cref), METHOD_VISI_UNDEF, FALSE, cref, FALSE); | ||||
| 	cref = CREF_NEXT(cref); | ||||
| 	*new_cref_ptr = new_cref; | ||||
| 	new_cref_ptr = (rb_cref_t **)&new_cref->next; | ||||
|  | @ -540,10 +537,9 @@ rb_vm_rewrite_cref(rb_cref_t *cref, VALUE old_klass, VALUE new_klass, rb_cref_t | |||
| } | ||||
| 
 | ||||
| static rb_cref_t * | ||||
| vm_cref_push(rb_thread_t *th, VALUE klass, rb_block_t *blockptr) | ||||
| vm_cref_push(rb_thread_t *th, VALUE klass, rb_block_t *blockptr, int pushed_by_eval) | ||||
| { | ||||
|     const rb_cref_t *prev_cref = NULL; | ||||
|     rb_cref_t *cref = NULL; | ||||
|     rb_cref_t *prev_cref = NULL; | ||||
| 
 | ||||
|     if (blockptr) { | ||||
| 	prev_cref = vm_env_cref(blockptr->ep); | ||||
|  | @ -555,15 +551,8 @@ vm_cref_push(rb_thread_t *th, VALUE klass, rb_block_t *blockptr) | |||
| 	    prev_cref = vm_env_cref(cfp->ep); | ||||
| 	} | ||||
|     } | ||||
|     cref = vm_cref_new(klass, METHOD_VISI_PUBLIC, prev_cref); | ||||
| 
 | ||||
|     /* TODO: why CREF_NEXT(cref) is 1? */ | ||||
|     if (CREF_NEXT(cref) && CREF_NEXT(cref) != (void *) 1 && | ||||
| 	!NIL_P(CREF_REFINEMENTS(CREF_NEXT(cref)))) { | ||||
| 	COPY_CREF_OMOD(cref, CREF_NEXT(cref)); | ||||
|     } | ||||
| 
 | ||||
|     return cref; | ||||
|     return vm_cref_new(klass, METHOD_VISI_PUBLIC, FALSE, prev_cref, pushed_by_eval); | ||||
| } | ||||
| 
 | ||||
| static inline VALUE | ||||
|  |  | |||
|  | @ -121,25 +121,6 @@ enum vm_regan_acttype { | |||
| /* deal with control flow 2: method/iterator              */ | ||||
| /**********************************************************/ | ||||
| 
 | ||||
| #define COPY_CREF_OMOD(c1, c2) do {  \ | ||||
|   CREF_REFINEMENTS_SET(c1, CREF_REFINEMENTS(c2)); \ | ||||
|   if (!NIL_P(CREF_REFINEMENTS(c2))) { \ | ||||
|       CREF_OMOD_SHARED_SET(c1); \ | ||||
|       CREF_OMOD_SHARED_SET(c2); \ | ||||
|   } \ | ||||
| } while (0) | ||||
| 
 | ||||
| #define COPY_CREF(c1, c2) do {  \ | ||||
|   rb_cref_t *__tmp_c2 = (c2); \ | ||||
|   COPY_CREF_OMOD((c1), __tmp_c2); \ | ||||
|   CREF_CLASS_SET((c1), CREF_CLASS(__tmp_c2));\ | ||||
|   CREF_SCOPE_VISI_COPY((c1), __tmp_c2);\ | ||||
|   CREF_NEXT_SET((c1), CREF_NEXT(__tmp_c2));\ | ||||
|   if (CREF_PUSHED_BY_EVAL(__tmp_c2)) { \ | ||||
|       CREF_PUSHED_BY_EVAL_SET(c1); \ | ||||
|   } \ | ||||
| } while (0) | ||||
| 
 | ||||
| #define CALL_METHOD(calling, ci, cc) do { \ | ||||
|     VALUE v = (*(cc)->call)(th, GET_CFP(), (calling), (ci), (cc)); \ | ||||
|     if (v == Qundef) { \ | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 ko1
						ko1