mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	gen_getattr: make the gi_running and gi_frame members discoverable (but
not writable -- too dangerous!) from Python code.
This commit is contained in:
		
							parent
							
								
									0ba70cc3c8
								
							
						
					
					
						commit
						e77f2e2798
					
				
					 2 changed files with 39 additions and 6 deletions
				
			
		|  | @ -115,8 +115,8 @@ typedef struct { | |||
| 
 | ||||
| 	PyFrameObject *gi_frame; | ||||
| 
 | ||||
|         /* True if generator is being executed. */  | ||||
|         int gi_running; | ||||
| 	/* True if generator is being executed. */  | ||||
| 	int gi_running; | ||||
| } genobject; | ||||
| 
 | ||||
| static PyObject * | ||||
|  | @ -207,14 +207,27 @@ gen_getiter(PyObject *gen) | |||
| 
 | ||||
| static struct PyMethodDef gen_methods[] = { | ||||
| 	{"next",     (PyCFunction)gen_next, METH_VARARGS, | ||||
| 	 "next() -- get the next value, or raise StopIteration"}, | ||||
| 	 	"next() -- get the next value, or raise StopIteration"}, | ||||
| 	{NULL,          NULL}   /* Sentinel */ | ||||
| }; | ||||
| 
 | ||||
| static PyObject * | ||||
| gen_getattr(genobject *gen, char *name) | ||||
| { | ||||
| 	return Py_FindMethod(gen_methods, (PyObject *)gen, name); | ||||
| 	PyObject *result; | ||||
| 
 | ||||
| 	if (strcmp(name, "gi_frame") == 0) { | ||||
| 		result = (PyObject *)gen->gi_frame; | ||||
| 		assert(result != NULL); | ||||
| 		Py_INCREF(result); | ||||
| 	} | ||||
| 	else if (strcmp(name, "gi_running") == 0) | ||||
| 		result = (PyObject *)PyInt_FromLong((long)gen->gi_running); | ||||
| 	else if (strcmp(name, "__members__") == 0) | ||||
| 		result = Py_BuildValue("[ss]", "gi_frame", "gi_running"); | ||||
| 	else | ||||
|  		result = Py_FindMethod(gen_methods, (PyObject *)gen, name); | ||||
|  	return result; | ||||
| } | ||||
| 
 | ||||
| statichere PyTypeObject gentype = { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Tim Peters
						Tim Peters