mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			93 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			93 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; | ||
|  | } |