mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	call __import__() with 4 args instead of 1
This commit is contained in:
		
							parent
							
								
									becdbec806
								
							
						
					
					
						commit
						24c137432c
					
				
					 2 changed files with 56 additions and 2 deletions
				
			
		|  | @ -47,8 +47,12 @@ builtin___import__(self, args) | |||
| 	object *args; | ||||
| { | ||||
| 	char *name; | ||||
| 	object *globals = NULL; | ||||
| 	object *locals = NULL; | ||||
| 	object *fromlist = NULL; | ||||
| 
 | ||||
| 	if (!newgetargs(args, "s:__import__", &name)) | ||||
| 	if (!newgetargs(args, "s|OOO:__import__", | ||||
| 			&name, &globals, &locals, &fromlist)) | ||||
| 		return NULL; | ||||
| 	return import_module(name); | ||||
| } | ||||
|  |  | |||
|  | @ -93,6 +93,7 @@ static int import_from PROTO((object *, object *, object *)); | |||
| static object *build_class PROTO((object *, object *, object *)); | ||||
| static int access_statement PROTO((object *, object *, frameobject *)); | ||||
| static int exec_statement PROTO((object *, object *, object *)); | ||||
| static object *find_from_args PROTO((frameobject *, int)); | ||||
| 
 | ||||
| 
 | ||||
| /* Pointer to current frame, used to link new frames to */ | ||||
|  | @ -1338,7 +1339,19 @@ eval_code(co, globals, locals, owner, arg) | |||
| 					   "__import__ not found"); | ||||
| 				break; | ||||
| 			} | ||||
| 			w = mkvalue("(O)", w); | ||||
| 			if (is_methodobject(x)) { | ||||
| 				u = None; | ||||
| 				INCREF(u); | ||||
| 			} | ||||
| 			else { | ||||
| 				u = find_from_args(f, INSTR_OFFSET()); | ||||
| 				if (u == NULL) { | ||||
| 					x = u; | ||||
| 					break; | ||||
| 				} | ||||
| 			} | ||||
| 			w = mkvalue("(OOOO)", w, f->f_globals, f->f_locals, u); | ||||
| 			DECREF(u); | ||||
| 			if (w == NULL) { | ||||
| 				x = NULL; | ||||
| 				break; | ||||
|  | @ -1352,6 +1365,7 @@ eval_code(co, globals, locals, owner, arg) | |||
| 		case IMPORT_FROM: | ||||
| 			w = GETNAMEV(oparg); | ||||
| 			v = TOP(); | ||||
| 			fast_2_locals(f); | ||||
| 			err = import_from(f->f_locals, v, w); | ||||
| 			locals_2_fast(f, 0); | ||||
| 			break; | ||||
|  | @ -2711,3 +2725,39 @@ exec_statement(prog, globals, locals) | |||
| 	DECREF(v); | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| /* Hack for Ken Manheimer */ | ||||
| static object * | ||||
| find_from_args(f, nexti) | ||||
| 	frameobject *f; | ||||
| 	int nexti; | ||||
| { | ||||
| 	int opcode; | ||||
| 	int oparg; | ||||
| 	object *list, *name; | ||||
| 	unsigned char *next_instr; | ||||
| 	 | ||||
| 	next_instr = GETUSTRINGVALUE(f->f_code->co_code) + nexti; | ||||
| 	opcode = (*next_instr++); | ||||
| 	if (opcode != IMPORT_FROM) { | ||||
| 		printf("next opcode: %d\n", opcode); | ||||
| 		INCREF(None); | ||||
| 		return None; | ||||
| 	} | ||||
| 	 | ||||
| 	list = newlistobject(0); | ||||
| 	if (list == NULL) | ||||
| 		return NULL; | ||||
| 	 | ||||
| 	do { | ||||
| 		oparg = (next_instr += 2, (next_instr[-1]<<8) + next_instr[-2]); | ||||
| 		name = Getnamev(f, oparg); | ||||
| 		if (addlistitem(list, name) < 0) { | ||||
| 			DECREF(list); | ||||
| 			break; | ||||
| 		} | ||||
| 		opcode = (*next_instr++); | ||||
| 	} while (opcode == IMPORT_FROM); | ||||
| 	 | ||||
| 	return list; | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Guido van Rossum
						Guido van Rossum