mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	compile.c: compile_retry
* compile.c (compile_retry): extract from iseq_compile_each. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59596 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									b0e2c2476e
								
							
						
					
					
						commit
						bc33c5ce0a
					
				
					 1 changed files with 22 additions and 14 deletions
				
			
		
							
								
								
									
										36
									
								
								compile.c
									
										
									
									
									
								
							
							
						
						
									
										36
									
								
								compile.c
									
										
									
									
									
								
							|  | @ -4578,6 +4578,26 @@ compile_redo(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped) | ||||||
|     return COMPILE_OK; |     return COMPILE_OK; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static int | ||||||
|  | compile_retry(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped) | ||||||
|  | { | ||||||
|  |     const int line = nd_line(node); | ||||||
|  | 
 | ||||||
|  |     if (iseq->body->type == ISEQ_TYPE_RESCUE) { | ||||||
|  | 	ADD_INSN(ret, line, putnil); | ||||||
|  | 	ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETRY)); | ||||||
|  | 
 | ||||||
|  | 	if (popped) { | ||||||
|  | 	    ADD_INSN(ret, line, pop); | ||||||
|  | 	} | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  | 	COMPILE_ERROR(ERROR_ARGS "Invalid retry"); | ||||||
|  | 	return COMPILE_NG; | ||||||
|  |     } | ||||||
|  |     return COMPILE_OK; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped); | static int iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popped); | ||||||
| /**
 | /**
 | ||||||
|   compile each node |   compile each node | ||||||
|  | @ -4752,21 +4772,9 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, NODE *node, int popp | ||||||
|       case NODE_REDO: |       case NODE_REDO: | ||||||
| 	CHECK(compile_redo(iseq, ret, node, popped)); | 	CHECK(compile_redo(iseq, ret, node, popped)); | ||||||
| 	break; | 	break; | ||||||
|       case NODE_RETRY:{ |       case NODE_RETRY: | ||||||
| 	if (iseq->body->type == ISEQ_TYPE_RESCUE) { | 	CHECK(compile_retry(iseq, ret, node, popped)); | ||||||
| 	    ADD_INSN(ret, line, putnil); |  | ||||||
| 	    ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETRY)); |  | ||||||
| 
 |  | ||||||
| 	    if (popped) { |  | ||||||
| 		ADD_INSN(ret, line, pop); |  | ||||||
| 	    } |  | ||||||
| 	} |  | ||||||
| 	else { |  | ||||||
| 	    COMPILE_ERROR(ERROR_ARGS "Invalid retry"); |  | ||||||
| 	    goto ng; |  | ||||||
| 	} |  | ||||||
| 	break; | 	break; | ||||||
|       } |  | ||||||
|       case NODE_BEGIN:{ |       case NODE_BEGIN:{ | ||||||
| 	CHECK(COMPILE_(ret, "NODE_BEGIN", node->nd_body, popped)); | 	CHECK(COMPILE_(ret, "NODE_BEGIN", node->nd_body, popped)); | ||||||
| 	break; | 	break; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 nobu
						nobu