mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-31286, bpo-30024: Fixed stack usage in absolute imports with (#3217)
binding a submodule to a name.
This commit is contained in:
		
							parent
							
								
									ba7d736521
								
							
						
					
					
						commit
						265fcc5fc2
					
				
					 2 changed files with 33 additions and 10 deletions
				
			
		|  | @ -2673,28 +2673,34 @@ compiler_import_as(struct compiler *c, identifier name, identifier asname) | |||
|        If there is a dot in name, we need to split it and emit a | ||||
|        IMPORT_FROM for each name. | ||||
|     */ | ||||
|     Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, | ||||
|                                         PyUnicode_GET_LENGTH(name), 1); | ||||
|     Py_ssize_t len = PyUnicode_GET_LENGTH(name); | ||||
|     Py_ssize_t dot = PyUnicode_FindChar(name, '.', 0, len, 1); | ||||
|     if (dot == -2) | ||||
|         return 0; | ||||
|     if (dot != -1) { | ||||
|         /* Consume the base module name to get the first attribute */ | ||||
|         Py_ssize_t pos = dot + 1; | ||||
|         while (dot != -1) { | ||||
|         while (1) { | ||||
|             Py_ssize_t pos = dot + 1; | ||||
|             PyObject *attr; | ||||
|             dot = PyUnicode_FindChar(name, '.', pos, | ||||
|                                      PyUnicode_GET_LENGTH(name), 1); | ||||
|             dot = PyUnicode_FindChar(name, '.', pos, len, 1); | ||||
|             if (dot == -2) | ||||
|                 return 0; | ||||
|             attr = PyUnicode_Substring(name, pos, | ||||
|                                        (dot != -1) ? dot : | ||||
|                                        PyUnicode_GET_LENGTH(name)); | ||||
|             attr = PyUnicode_Substring(name, pos, (dot != -1) ? dot : len); | ||||
|             if (!attr) | ||||
|                 return 0; | ||||
|             ADDOP_O(c, IMPORT_FROM, attr, names); | ||||
|             Py_DECREF(attr); | ||||
|             pos = dot + 1; | ||||
|             if (dot == -1) { | ||||
|                 break; | ||||
|             } | ||||
|             ADDOP(c, ROT_TWO); | ||||
|             ADDOP(c, POP_TOP); | ||||
|         } | ||||
|         if (!compiler_nameop(c, asname, Store)) { | ||||
|             return 0; | ||||
|         } | ||||
|         ADDOP(c, POP_TOP); | ||||
|         return 1; | ||||
|     } | ||||
|     return compiler_nameop(c, asname, Store); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Serhiy Storchaka
						Serhiy Storchaka