mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	 3e0055f8c6
			
		
	
	
		3e0055f8c6
		
	
	
	
	
		
			
			This change implements a new bytecode compiler, based on a transformation of the parse tree to an abstract syntax defined in Parser/Python.asdl. The compiler implementation is not complete, but it is in stable enough shape to run the entire test suite excepting two disabled tests.
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "Python.h"
 | |
| #include "asdl.h"
 | |
| 
 | |
| asdl_seq *
 | |
| asdl_seq_new(int size)
 | |
| {
 | |
| 	asdl_seq *seq = NULL;
 | |
| 	size_t n = sizeof(asdl_seq) +
 | |
| 			(size ? (sizeof(void *) * (size - 1)) : 0);
 | |
| 
 | |
| 	seq = (asdl_seq *)PyObject_Malloc(n);
 | |
| 	if (!seq) {
 | |
| 		PyErr_SetString(PyExc_MemoryError, "no memory");
 | |
| 		return NULL;
 | |
| 	}
 | |
| 	memset(seq, 0, n);
 | |
| 	seq->size = size;
 | |
| 	return seq;
 | |
| }
 | |
| 
 | |
| void
 | |
| asdl_seq_free(asdl_seq *seq)
 | |
| {
 | |
| 	PyObject_Free(seq);
 | |
| }
 | |
| 
 | |
| #define CHECKSIZE(BUF, OFF, MIN) { \
 | |
| 	int need = *(OFF) + MIN; \
 | |
| 	if (need >= PyString_GET_SIZE(*(BUF))) { \
 | |
| 		int newsize = PyString_GET_SIZE(*(BUF)) * 2; \
 | |
| 		if (newsize < need) \
 | |
| 			newsize = need; \
 | |
| 		if (_PyString_Resize((BUF), newsize) < 0) \
 | |
| 			return 0; \
 | |
| 	} \
 | |
| } 
 | |
| 
 | |
| int 
 | |
| marshal_write_int(PyObject **buf, int *offset, int x)
 | |
| {
 | |
| 	char *s;
 | |
| 
 | |
| 	CHECKSIZE(buf, offset, 4)
 | |
| 	s = PyString_AS_STRING(*buf) + (*offset);
 | |
| 	s[0] = (x & 0xff);
 | |
| 	s[1] = (x >> 8) & 0xff;
 | |
| 	s[2] = (x >> 16) & 0xff;
 | |
| 	s[3] = (x >> 24) & 0xff;
 | |
| 	*offset += 4;
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| int 
 | |
| marshal_write_bool(PyObject **buf, int *offset, bool b)
 | |
| {
 | |
| 	if (b)
 | |
| 		marshal_write_int(buf, offset, 1);
 | |
| 	else
 | |
| 		marshal_write_int(buf, offset, 0);
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| int 
 | |
| marshal_write_identifier(PyObject **buf, int *offset, identifier id)
 | |
| {
 | |
| 	int l = PyString_GET_SIZE(id);
 | |
| 	marshal_write_int(buf, offset, l);
 | |
| 	CHECKSIZE(buf, offset, l);
 | |
| 	memcpy(PyString_AS_STRING(*buf) + *offset,
 | |
| 	       PyString_AS_STRING(id), l);
 | |
| 	*offset += l;
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| int 
 | |
| marshal_write_string(PyObject **buf, int *offset, string s)
 | |
| {
 | |
| 	int len = PyString_GET_SIZE(s);
 | |
| 	marshal_write_int(buf, offset, len);
 | |
| 	CHECKSIZE(buf, offset, len);
 | |
| 	memcpy(PyString_AS_STRING(*buf) + *offset,
 | |
| 	       PyString_AS_STRING(s), len);
 | |
| 	*offset += len;
 | |
| 	return 1;
 | |
| }
 | |
| 
 | |
| int 
 | |
| marshal_write_object(PyObject **buf, int *offset, object s)
 | |
| {
 | |
| 	/* XXX */
 | |
| 	return 0;
 | |
| }
 |