mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	matz
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									e1461461cc
								
							
						
					
					
						commit
						79a8072910
					
				
					 3 changed files with 65 additions and 61 deletions
				
			
		
							
								
								
									
										18
									
								
								ChangeLog
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								ChangeLog
									
										
									
									
									
								
							|  | @ -2,10 +2,24 @@ Mon Sep 18 17:46:11 2000  Yukihiro Matsumoto  <matz@ruby-lang.org> | |||
| 
 | ||||
| 	* stable version 1.6.0 released. | ||||
| 
 | ||||
| Tue Sep 19 01:14:56 2000  Yukihiro Matsumoto  <matz@ruby-lang.org> | ||||
| 
 | ||||
| 	* eval.c (rb_provide): better feature handling. | ||||
| 
 | ||||
| 	* eval.c (rb_f_require): loading ruby library may be partial | ||||
| 	  state.  checks in rb_thread_loading is integrated. | ||||
| 
 | ||||
| 	* eval.c (rb_provided): better thread awareness. | ||||
| 
 | ||||
| 	* lib/irb/frame.rb: 6 (not 5) parameters for trace_func proc. | ||||
| 
 | ||||
| 	* eval.c (error_print): should print error position even if | ||||
| 	  get_backtrace() failed. | ||||
| 
 | ||||
| Sat Sep 16 03:29:59 2000  Yukihiro Matsumoto  <matz@ruby-lang.org> | ||||
| 
 | ||||
| 	* eval.c (rb_f_require): rb_provided() called too early; does not | ||||
| 	  work well with threads. | ||||
| 	* eval.c (rb_f_require): rb_provided() was called too early; does | ||||
| 	  not work well with threads. | ||||
| 
 | ||||
| 	* parse.y (ensure): should distinguish empty ensure and non | ||||
| 	  existing ensure. | ||||
|  |  | |||
							
								
								
									
										106
									
								
								eval.c
									
										
									
									
									
								
							
							
						
						
									
										106
									
								
								eval.c
									
										
									
									
									
								
							|  | @ -862,7 +862,7 @@ set_backtrace(info, bt) | |||
| static void | ||||
| error_print() | ||||
| { | ||||
|     VALUE errat; | ||||
|     VALUE errat = Qnil; | ||||
|     VALUE eclass; | ||||
|     char *einfo; | ||||
|     int elen; | ||||
|  | @ -877,7 +877,10 @@ error_print() | |||
| 	errat = Qnil; | ||||
|     } | ||||
|     POP_TAG(); | ||||
|     if (!NIL_P(errat)) { | ||||
|     if (NIL_P(errat)) { | ||||
| 	fprintf(stderr, "%s:%d", ruby_sourcefile, ruby_sourceline); | ||||
|     } | ||||
|     else { | ||||
| 	VALUE mesg = RARRAY(errat)->ptr[0]; | ||||
| 
 | ||||
| 	if (NIL_P(mesg)) error_pos(); | ||||
|  | @ -5018,6 +5021,7 @@ rb_f_load(argc, argv) | |||
| } | ||||
| 
 | ||||
| static VALUE rb_features; | ||||
| static st_table *loading_tbl; | ||||
| 
 | ||||
| static int | ||||
| rb_provided(feature) | ||||
|  | @ -5031,19 +5035,32 @@ rb_provided(feature) | |||
|     pend = p + RARRAY(rb_features)->len; | ||||
|     while (p < pend) { | ||||
| 	f = STR2CSTR(*p); | ||||
| 	if (strcmp(f, feature) == 0) return Qtrue; | ||||
| 	if (strcmp(f, feature) == 0) { | ||||
| 	    goto load_wait; | ||||
| 	} | ||||
| 	len = strlen(feature); | ||||
| 	if (strncmp(f, feature, len) == 0 | ||||
| 	    && (strcmp(f+len, ".rb") == 0 ||strcmp(f+len, ".so") == 0)) { | ||||
| 	    return Qtrue; | ||||
| 	if (strncmp(f, feature, len) == 0) { | ||||
| 	    if (strcmp(f+len, ".so") == 0) { | ||||
| 		return Qtrue; | ||||
| 	    } | ||||
| 	    goto load_wait; | ||||
| 	} | ||||
| 	p++; | ||||
|     } | ||||
|     return Qfalse; | ||||
| } | ||||
| 
 | ||||
| static int rb_thread_loading _((const char*)); | ||||
| static void rb_thread_loading_done _((const char*)); | ||||
|   load_wait: | ||||
|     if (loading_tbl) { | ||||
| 	char *ext = strrchr(f, '.'); | ||||
| 	if (strcmp(ext, ".rb") == 0) { | ||||
| 	    while (st_lookup(loading_tbl, f, 0)) { | ||||
| 		CHECK_INTS; | ||||
| 		rb_thread_schedule(); | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|     return Qtrue; | ||||
| } | ||||
| 
 | ||||
| void | ||||
| rb_provide(feature) | ||||
|  | @ -5051,17 +5068,20 @@ rb_provide(feature) | |||
| { | ||||
|     char *buf, *ext; | ||||
| 
 | ||||
|     if (!rb_provided(feature)) { | ||||
| 	ext = strrchr(feature, '.'); | ||||
| 	if (ext && strcmp(DLEXT, ext) == 0) { | ||||
| 	    buf = ALLOCA_N(char, strlen(feature)+4); | ||||
| 	    strcpy(buf, feature); | ||||
| 	    ext = strrchr(buf, '.'); | ||||
| 	    strcpy(ext, ".so"); | ||||
| 	    feature = buf; | ||||
| 	} | ||||
| 	rb_ary_push(rb_features, rb_str_new2(feature)); | ||||
|     ext = strrchr(feature, '.'); | ||||
|     if (ext && (strcmp(DLEXT, ext) == 0 | ||||
| #ifdef DLEXT2 | ||||
| 	     || strcmp(DLEXT2, ext) == 0 | ||||
| #endif | ||||
| 	)) { | ||||
| 	buf = ALLOCA_N(char, strlen(feature)+4); | ||||
| 	strcpy(buf, feature); | ||||
| 	ext = strrchr(buf, '.'); | ||||
| 	strcpy(ext, ".so"); | ||||
| 	feature = buf; | ||||
|     } | ||||
|     if (rb_provided(feature)) return; | ||||
|     rb_ary_push(rb_features, rb_str_new2(feature)); | ||||
| } | ||||
| 
 | ||||
| VALUE | ||||
|  | @ -5074,21 +5094,19 @@ rb_f_require(obj, fname) | |||
|     volatile int safe = ruby_safe_level; | ||||
| 
 | ||||
|     Check_SafeStr(fname); | ||||
|     if (rb_provided(RSTRING(fname)->ptr)) return Qfalse; | ||||
|     ext = strrchr(RSTRING(fname)->ptr, '.'); | ||||
|     if (ext) { | ||||
| 	feature = file = RSTRING(fname)->ptr; | ||||
| 	if (strcmp(".rb", ext) == 0) { | ||||
| 	    feature = file = RSTRING(fname)->ptr; | ||||
| 	    file = rb_find_file(file); | ||||
| 	    if (file) goto load_rb; | ||||
| 	} | ||||
| 	else if (strcmp(".so", ext) == 0 || strcmp(".o", ext) == 0) { | ||||
| 	    file = feature = RSTRING(fname)->ptr; | ||||
| 	    if (strcmp(ext, DLEXT) != 0) { | ||||
| 		buf = ALLOCA_N(char, strlen(file)+sizeof(DLEXT)+4); | ||||
| 		strcpy(buf, feature); | ||||
| 		ext = strrchr(buf, '.'); | ||||
| 		strcpy(ext, ".so"); | ||||
| 		if (rb_provided(buf)) return Qfalse; | ||||
| 		strcpy(ext, DLEXT); | ||||
| 		file = feature = buf; | ||||
| 	    } | ||||
|  | @ -5100,8 +5118,6 @@ rb_f_require(obj, fname) | |||
| 		buf = ALLOCA_N(char, strlen(file)+sizeof(DLEXT2)+4); | ||||
| 		strcpy(buf, feature); | ||||
| 		ext = strrchr(buf, '.'); | ||||
| 		strcpy(ext, ".so"); | ||||
| 		if (rb_provided(buf)) return Qfalse; | ||||
| 		strcpy(ext, DLEXT2); | ||||
| 		file = feature = buf; | ||||
| 	    } | ||||
|  | @ -5150,7 +5166,6 @@ rb_f_require(obj, fname) | |||
| 	     RSTRING(fname)->ptr); | ||||
| 
 | ||||
|   load_dyna: | ||||
|     if (rb_thread_loading(feature)) return Qfalse; | ||||
|     rb_provide(feature); | ||||
| 
 | ||||
|     PUSH_TAG(PROT_NONE); | ||||
|  | @ -5160,22 +5175,26 @@ rb_f_require(obj, fname) | |||
| 	dln_load(file); | ||||
|     } | ||||
|     POP_TAG(); | ||||
|     rb_thread_loading_done(feature); | ||||
|     if (state) JUMP_TAG(state); | ||||
| 
 | ||||
|     return Qtrue; | ||||
| 
 | ||||
|   load_rb: | ||||
|     ruby_safe_level = 0; | ||||
|     if (rb_thread_loading(feature)) return Qfalse; | ||||
|     rb_provide(feature); | ||||
|     /* loading ruby library should be serialized. */ | ||||
|     if (!loading_tbl) { | ||||
| 	loading_tbl = st_init_strtable(); | ||||
|     } | ||||
|     st_insert(loading_tbl, strdup(feature), 0);	/* partial state */ | ||||
| 
 | ||||
|     PUSH_TAG(PROT_NONE); | ||||
|     if ((state = EXEC_TAG()) == 0) { | ||||
| 	rb_load(fname, 0); | ||||
|     } | ||||
|     POP_TAG(); | ||||
|     rb_thread_loading_done(feature); | ||||
|     st_delete(loading_tbl, &feature, 0); /* loading done */ | ||||
|     free(feature); | ||||
|     ruby_safe_level = safe; | ||||
|     if (state) JUMP_TAG(state); | ||||
| 
 | ||||
|  | @ -8013,35 +8032,6 @@ rb_thread_raise(argc, argv, thread) | |||
|     return Qnil;		/* not reached */ | ||||
| } | ||||
| 
 | ||||
| static st_table *loading_tbl; | ||||
| 
 | ||||
| static int | ||||
| rb_thread_loading(feature) | ||||
|     const char *feature; | ||||
| { | ||||
|     if (!loading_tbl) { | ||||
| 	loading_tbl = st_init_strtable(); | ||||
|     } | ||||
|     if (!rb_provided(feature)) { | ||||
| 	st_insert(loading_tbl, feature, 0); | ||||
| 	return Qfalse; /* need to load */ | ||||
|     } | ||||
|     while (st_lookup(loading_tbl, feature, 0)) { | ||||
| 	CHECK_INTS; | ||||
| 	rb_thread_schedule(); | ||||
|     } | ||||
|     return Qtrue; | ||||
| } | ||||
| 
 | ||||
| static void | ||||
| rb_thread_loading_done(feature) | ||||
|     const char *feature; | ||||
| { | ||||
|     if (loading_tbl) { | ||||
| 	st_delete(loading_tbl, &feature, 0); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| VALUE | ||||
| rb_thread_local_aref(thread, id) | ||||
|     VALUE thread; | ||||
|  |  | |||
|  | @ -60,7 +60,7 @@ module IRB | |||
|     end | ||||
| 
 | ||||
|     @backtrace = Frame.new | ||||
|     set_trace_func proc{|event, file, line, id, binding| | ||||
|     set_trace_func proc{|event, file, line, id, binding, klass| | ||||
|       @backtrace.trace_func(event, file, line, id, binding) | ||||
|     } | ||||
|   end | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 matz
						matz