Exemplo n.º 1
0
/*
================
PR_ParseFunctionBody
================
*/
void PR_ParseFunctionBody (type_t *type, char *name, def_t *def)
{
	function_t	*f;
	dfunction_t	*df;
	int			locals_start;

	if (pr_scope)
		PR_ParseError ("'%s': local function definitions are illegal", name);

	if (def->initialized)
		PR_ParseError ("function '%s' already has a body", name);

	locals_start = locals_end = numpr_globals;
	pr_scope = def;
	f = PR_ParseImmediateStatements (type);
	pr_scope = NULL;
	def->initialized = 1;
	G_FUNCTION(def->ofs) = numfunctions;
	f->def = def;

//	if (opt_dumpasm)
//		PR_PrintFunction (def);

// fill in the dfunction
	df = &functions[numfunctions];
	numfunctions++;
	if (f->builtin)
		df->first_statement = -f->builtin;
	else
		df->first_statement = f->code;
	df->s_name = CopyString (f->def->name);
	df->s_file = s_file;
	// id's qcc would set numparms to -1 for varargs functions
	// but non-builtin varargs functions don't make sense anyway so don't bother checking
	df->numparms = f->def->type->num_parms & VA_MASK;
	df->locals = locals_end - locals_start;
	df->parm_start = locals_start;
	for (int i=0 ; i<df->numparms ; i++)
		df->parm_size[i] = type_size[f->def->type->parm_types[i]->type];
}
Exemplo n.º 2
0
/*
================
PR_ParseDefs

Called at the outer layer and when a local statement is hit
================
*/
void PR_ParseDefs (void)
{
	char		*name;
	type_t		*type;
	def_t		*def;
	function_t	*f;
	dfunction_t	*df;
	int			i;
	int			locals_start;

	type = PR_ParseType ();
	
	if (pr_scope && (type->type == ev_field || type->type == ev_function) )
		PR_ParseError ("Fields and functions must be global");
		
	do
	{
		name = PR_ParseName ();

		def = PR_GetDef (type, name, pr_scope, true);
		
// check for an initialization
		if ( PR_Check ("=") )
		{
			if (def->initialized)
				PR_ParseError ("%s redeclared", name);
	
			if (type->type == ev_function)
			{
				locals_start = locals_end = numpr_globals;
				pr_scope = def;
				f = PR_ParseImmediateStatements (type);
				pr_scope = NULL;
				def->initialized = 1;
				G_FUNCTION(def->ofs) = numfunctions;
				f->def = def;
//				if (pr_dumpasm)
//					PR_PrintFunction (def);

		// fill in the dfunction
				df = &functions[numfunctions];
				numfunctions++;
				if (f->builtin)
					df->first_statement = -f->builtin;
				else
					df->first_statement = f->code;
				df->s_name = CopyString (f->def->name);
				df->s_file = s_file;
				df->numparms =  f->def->type->num_parms;
				df->locals = locals_end - locals_start;
				df->parm_start = locals_start;
				for (i=0 ; i<df->numparms ; i++)
					df->parm_size[i] = type_size[f->def->type->parm_types[i]->type];
				
				continue;
			}
			else if (pr_immediate_type != type)
				PR_ParseError ("wrong immediate type for %s", name);
	
			def->initialized = 1;
			memcpy (pr_globals + def->ofs, &pr_immediate, 4*type_size[pr_immediate_type->type]);
			PR_Lex ();
		}
		
	} while (PR_Check (","));

	PR_Expect (";");
}