mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	* vm_core.h: remove VM_FRAME_MAGIC_LAMBDA and introduce
VM_FRAME_FLAG_LAMBDA. So that lambda block frame is VM_FRAME_MAGIC_BLOCK | VM_FRAME_FLAG_LAMBDA. * vm_core.h: remvoe VM_FRAME_MAGIC_PROC because nobody uses it. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59006 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									08d44417e0
								
							
						
					
					
						commit
						26864584d2
					
				
					 4 changed files with 21 additions and 29 deletions
				
			
		
							
								
								
									
										7
									
								
								vm.c
									
										
									
									
									
								
							
							
						
						
									
										7
									
								
								vm.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1008,7 +1008,7 @@ invoke_iseq_block_from_c(rb_thread_t *th, const struct rb_captured_block *captur
 | 
			
		|||
{
 | 
			
		||||
    const rb_iseq_t *iseq = rb_iseq_check(captured->code.iseq);
 | 
			
		||||
    int i, opt_pc;
 | 
			
		||||
    VALUE type = is_lambda ? VM_FRAME_MAGIC_LAMBDA : VM_FRAME_MAGIC_BLOCK;
 | 
			
		||||
    VALUE type = VM_FRAME_MAGIC_BLOCK | (is_lambda ? VM_FRAME_FLAG_LAMBDA : 0);
 | 
			
		||||
    rb_control_frame_t *cfp = th->ec.cfp;
 | 
			
		||||
    VALUE *sp = cfp->sp;
 | 
			
		||||
    const rb_callable_method_entry_t *me = th->passed_bmethod_me;
 | 
			
		||||
| 
						 | 
				
			
			@ -1021,7 +1021,7 @@ invoke_iseq_block_from_c(rb_thread_t *th, const struct rb_captured_block *captur
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    opt_pc = vm_yield_setup_args(th, iseq, argc, sp, passed_block_handler,
 | 
			
		||||
				 (type == VM_FRAME_MAGIC_LAMBDA ? (splattable ? arg_setup_lambda : arg_setup_method) : arg_setup_block));
 | 
			
		||||
				 (is_lambda ? (splattable ? arg_setup_lambda : arg_setup_method) : arg_setup_block));
 | 
			
		||||
    cfp->sp = sp;
 | 
			
		||||
 | 
			
		||||
    if (me == NULL) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1605,10 +1605,8 @@ vm_frametype_name(const rb_control_frame_t *cfp)
 | 
			
		|||
      case VM_FRAME_MAGIC_CLASS:  return "class";
 | 
			
		||||
      case VM_FRAME_MAGIC_TOP:    return "top";
 | 
			
		||||
      case VM_FRAME_MAGIC_CFUNC:  return "cfunc";
 | 
			
		||||
      case VM_FRAME_MAGIC_PROC:   return "proc";
 | 
			
		||||
      case VM_FRAME_MAGIC_IFUNC:  return "ifunc";
 | 
			
		||||
      case VM_FRAME_MAGIC_EVAL:   return "eval";
 | 
			
		||||
      case VM_FRAME_MAGIC_LAMBDA: return "lambda";
 | 
			
		||||
      case VM_FRAME_MAGIC_RESCUE: return "rescue";
 | 
			
		||||
      default:
 | 
			
		||||
	rb_bug("unknown frame");
 | 
			
		||||
| 
						 | 
				
			
			@ -1665,7 +1663,6 @@ hook_before_rewind(rb_thread_t *th, const rb_control_frame_t *cfp, int will_fini
 | 
			
		|||
	THROW_DATA_CONSUMED_SET(err);
 | 
			
		||||
	break;
 | 
			
		||||
      case VM_FRAME_MAGIC_BLOCK:
 | 
			
		||||
      case VM_FRAME_MAGIC_LAMBDA:
 | 
			
		||||
	if (VM_FRAME_BMETHOD_P(th->ec.cfp)) {
 | 
			
		||||
	    EXEC_EVENT_HOOK(th, RUBY_EVENT_B_RETURN, th->ec.cfp->self, 0, 0, 0, frame_return_value(err));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								vm_core.h
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								vm_core.h
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -980,12 +980,12 @@ typedef rb_control_frame_t *
 | 
			
		|||
 | 
			
		||||
enum {
 | 
			
		||||
    /* Frame/Environment flag bits:
 | 
			
		||||
     *   MMMM MMMM MMMM MMMM ____ ____ FFFF EEEX (LSB)
 | 
			
		||||
     *   MMMM MMMM MMMM MMMM ____ __FF FFFF EEEX (LSB)
 | 
			
		||||
     *
 | 
			
		||||
     * X   : tag for GC marking (It seems as Fixnum)
 | 
			
		||||
     * EEE : 3 bits Env flags
 | 
			
		||||
     * FFFF: 4 bits Frame flags
 | 
			
		||||
     * MMMM: 16 bits frame magic (to check frame corruption)
 | 
			
		||||
     * FF..: 6 bits Frame flags
 | 
			
		||||
     * MM..: 16 bits frame magic (to check frame corruption)
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    /* frame types */
 | 
			
		||||
| 
						 | 
				
			
			@ -994,12 +994,10 @@ enum {
 | 
			
		|||
    VM_FRAME_MAGIC_CLASS  = 0x33330001,
 | 
			
		||||
    VM_FRAME_MAGIC_TOP    = 0x44440001,
 | 
			
		||||
    VM_FRAME_MAGIC_CFUNC  = 0x55550001,
 | 
			
		||||
    VM_FRAME_MAGIC_PROC   = 0x66660001,
 | 
			
		||||
    VM_FRAME_MAGIC_IFUNC  = 0x77770001,
 | 
			
		||||
    VM_FRAME_MAGIC_EVAL   = 0x88880001,
 | 
			
		||||
    VM_FRAME_MAGIC_LAMBDA = 0x99990001,
 | 
			
		||||
    VM_FRAME_MAGIC_RESCUE = 0xaaaa0001,
 | 
			
		||||
    VM_FRAME_MAGIC_DUMMY  = 0xbbbb0001,
 | 
			
		||||
    VM_FRAME_MAGIC_IFUNC  = 0x66660001,
 | 
			
		||||
    VM_FRAME_MAGIC_EVAL   = 0x77770001,
 | 
			
		||||
    VM_FRAME_MAGIC_RESCUE = 0x88880001,
 | 
			
		||||
    VM_FRAME_MAGIC_DUMMY  = 0x99990001,
 | 
			
		||||
 | 
			
		||||
    VM_FRAME_MAGIC_MASK   = 0xffff0001,
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1008,6 +1006,7 @@ enum {
 | 
			
		|||
    VM_FRAME_FLAG_FINISH    = 0x0020,
 | 
			
		||||
    VM_FRAME_FLAG_BMETHOD   = 0x0040,
 | 
			
		||||
    VM_FRAME_FLAG_CFRAME    = 0x0080,
 | 
			
		||||
    VM_FRAME_FLAG_LAMBDA    = 0x0100,
 | 
			
		||||
 | 
			
		||||
    /* env flag */
 | 
			
		||||
    VM_ENV_FLAG_LOCAL       = 0x0002,
 | 
			
		||||
| 
						 | 
				
			
			@ -1057,10 +1056,16 @@ VM_FRAME_TYPE(const rb_control_frame_t *cfp)
 | 
			
		|||
    return VM_ENV_FLAGS(cfp->ep, VM_FRAME_MAGIC_MASK);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
VM_FRAME_LAMBDA_P(const rb_control_frame_t *cfp)
 | 
			
		||||
{
 | 
			
		||||
    return VM_ENV_FLAGS(cfp->ep, VM_FRAME_FLAG_LAMBDA) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
VM_FRAME_FINISHED_P(const rb_control_frame_t *cfp)
 | 
			
		||||
{
 | 
			
		||||
    return VM_ENV_FLAGS(cfp->ep, VM_FRAME_FLAG_FINISH ) != 0;
 | 
			
		||||
    return VM_ENV_FLAGS(cfp->ep, VM_FRAME_FLAG_FINISH) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static inline int
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,12 +60,6 @@ control_frame_dump(rb_thread_t *th, rb_control_frame_t *cfp)
 | 
			
		|||
      case VM_FRAME_MAGIC_CFUNC:
 | 
			
		||||
	magic = "CFUNC";
 | 
			
		||||
	break;
 | 
			
		||||
      case VM_FRAME_MAGIC_PROC:
 | 
			
		||||
	magic = "PROC";
 | 
			
		||||
	break;
 | 
			
		||||
      case VM_FRAME_MAGIC_LAMBDA:
 | 
			
		||||
	magic = "LAMBDA";
 | 
			
		||||
	break;
 | 
			
		||||
      case VM_FRAME_MAGIC_IFUNC:
 | 
			
		||||
	magic = "IFUNC";
 | 
			
		||||
	break;
 | 
			
		||||
| 
						 | 
				
			
			@ -258,8 +252,6 @@ vm_stack_dump_each(rb_thread_t *th, rb_control_frame_t *cfp)
 | 
			
		|||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_TOP   ||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_BLOCK ||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CLASS ||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_PROC  ||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_LAMBDA||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC ||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_IFUNC ||
 | 
			
		||||
	VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_EVAL  ||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -130,7 +130,7 @@ vm_check_frame_detail(VALUE type, int req_block, int req_me, int req_cref, VALUE
 | 
			
		|||
	}
 | 
			
		||||
	else { /* cref or Qfalse */
 | 
			
		||||
	    if (cref_or_me != Qfalse && cref_or_me_type != imemo_cref) {
 | 
			
		||||
		if ((magic == VM_FRAME_MAGIC_LAMBDA || magic == VM_FRAME_MAGIC_IFUNC) && (cref_or_me_type == imemo_ment)) {
 | 
			
		||||
		if (((type & VM_FRAME_FLAG_LAMBDA) || magic == VM_FRAME_MAGIC_IFUNC) && (cref_or_me_type == imemo_ment)) {
 | 
			
		||||
		    /* ignore */
 | 
			
		||||
		}
 | 
			
		||||
		else {
 | 
			
		||||
| 
						 | 
				
			
			@ -178,10 +178,8 @@ vm_check_frame(VALUE type,
 | 
			
		|||
	CHECK(VM_FRAME_MAGIC_TOP,    TRUE,  FALSE, TRUE,  FALSE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_CFUNC,  TRUE,  TRUE,  FALSE, TRUE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_BLOCK,  FALSE, FALSE, FALSE, FALSE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_PROC,   FALSE, FALSE, FALSE, FALSE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_IFUNC,  FALSE, FALSE, FALSE, TRUE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_EVAL,   FALSE, FALSE, FALSE, FALSE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_LAMBDA, FALSE, FALSE, FALSE, FALSE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_RESCUE, FALSE, FALSE, FALSE, FALSE);
 | 
			
		||||
	CHECK(VM_FRAME_MAGIC_DUMMY,  TRUE,  FALSE, FALSE, FALSE);
 | 
			
		||||
      default:
 | 
			
		||||
| 
						 | 
				
			
			@ -1073,7 +1071,7 @@ vm_throw_start(rb_thread_t *const th, rb_control_frame_t *const reg_cfp, enum ru
 | 
			
		|||
	    }
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (VM_FRAME_TYPE(escape_cfp) == VM_FRAME_MAGIC_LAMBDA) {
 | 
			
		||||
	if (VM_FRAME_LAMBDA_P(escape_cfp)) {
 | 
			
		||||
	    /* lambda{... break ...} */
 | 
			
		||||
	    is_orphan = 0;
 | 
			
		||||
	    state = TAG_RETURN;
 | 
			
		||||
| 
						 | 
				
			
			@ -1141,7 +1139,7 @@ vm_throw_start(rb_thread_t *const th, rb_control_frame_t *const reg_cfp, enum ru
 | 
			
		|||
	    }
 | 
			
		||||
 | 
			
		||||
	    if (lep == target_lep) {
 | 
			
		||||
		if (VM_FRAME_TYPE(escape_cfp) == VM_FRAME_MAGIC_LAMBDA) {
 | 
			
		||||
		if (VM_FRAME_LAMBDA_P(escape_cfp)) {
 | 
			
		||||
		    if (in_class_frame) {
 | 
			
		||||
			/* lambda {class A; ... return ...; end} */
 | 
			
		||||
			goto valid_return;
 | 
			
		||||
| 
						 | 
				
			
			@ -2684,7 +2682,7 @@ vm_invoke_iseq_block(rb_thread_t *th, rb_control_frame_t *reg_cfp,
 | 
			
		|||
    SET_SP(rsp);
 | 
			
		||||
 | 
			
		||||
    vm_push_frame(th, iseq,
 | 
			
		||||
		  is_lambda ? VM_FRAME_MAGIC_LAMBDA : VM_FRAME_MAGIC_BLOCK,
 | 
			
		||||
		  VM_FRAME_MAGIC_BLOCK | (is_lambda ? VM_FRAME_FLAG_LAMBDA : 0),
 | 
			
		||||
		  captured->self,
 | 
			
		||||
		  VM_GUARDED_PREV_EP(captured->ep), 0,
 | 
			
		||||
		  iseq->body->iseq_encoded + opt_pc,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue