/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its 
documentation for any purpose and without fee is hereby granted, 
provided that the above copyright notice appear in all copies and that
both that copyright notice and this permission notice appear in 
supporting documentation, and that the names of Stichting Mathematisch
Centrum or CWI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior permission.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

/* Module new -- create new objects of various types */

#include "allobjects.h"
#include "compile.h"

static char new_instance_doc[] =
"Create an instance object from (CLASS, DICT) without calling its __init__().";

static object *
new_instance(unused, args)
	object* unused;
	object* args;
{
	object* klass;
	object *dict;
	instanceobject *inst;
	if (!newgetargs(args, "O!O!",
			&Classtype, &klass,
			&Dicttype, &dict))
		return NULL;
	inst = NEWOBJ(instanceobject, &Instancetype);
	if (inst == NULL)
		return NULL;
	INCREF(klass);
	INCREF(dict);
	inst->in_class = (classobject *)klass;
	inst->in_dict = dict;
	return (object *)inst;
}

static char new_im_doc[] =
"Create a instance method object from (FUNCTION, INSTANCE, CLASS).";

static object *
new_instancemethod(unused, args)
	object* unused;
	object* args;
{
	object* func;
	object* self;
	object* classObj;

	if (!newgetargs(args, "O!O!O!",
			&Functype, &func,
			&Instancetype, &self,
			&Classtype, &classObj))
		return NULL;
	return newinstancemethodobject(func, self, classObj);
}

/* XXX These internal interfaces have changed -- who'll fix this code? */
#if 0

static char new_function_doc[] =
"Create a function object from (CODE, GLOBALS, [NAME, ARGCOUNT, ARGDEFS]).";

static object *
new_function(unused, args)
	object* unused;
	object* args;
{
	object* code;
	object* globals;
	object* name = None;
	int argcount = -1;
	object* argdefs = None;
	funcobject* newfunc;

	if (!newgetargs(args, "O!O!|SiO!",
			&Codetype, &code,
			&Mappingtype, &globals,
			&name,
			&argcount,
			&Tupletype, &argdefs))
		return NULL;

	newfunc = (funcobject *)newfuncobject(code, globals);
	if (newfunc == NULL)
		return NULL;

	if (name != None) {
		XINCREF(name);
		XDECREF(newfunc->func_name);
		newfunc->func_name = name;
	}
	newfunc->func_argcount = argcount;
	if (argdefs != NULL) {
		XINCREF(argdefs);
		XDECREF(newfunc->func_argdefs);
		newfunc->func_argdefs  = argdefs;
	}

	return (object *)newfunc;
}
#endif

static char new_code_doc[] =
"Create a code object from (ARGCOUNT, NLOCALS, FLAGS, CODESTRING, CONSTANTS, NAMES, VARNAMES, FILENAME, NAME).";

static object *
new_code(unused, args)
	object* unused;
	object* args;
{
	int argcount;
	int nlocals;
	int flags;
	object* code;
	object* consts;
	object* names;
	object* varnames;
	object* filename;
	object* name;
  
#if 0
	if (!newgetargs(args, "SO!O!SS",
			&code, &Tupletype, &consts, &Tupletype, &names,
			&filename, &name))
		return NULL;
	return (object *)newcodeobject(code, consts, names, filename, name);
#else
	if (!newgetargs(args, "iiiSO!O!O!SS",
			&argcount, &nlocals, &flags,	/* These are new */
			&code, &Tupletype, &consts, &Tupletype, &names,
			&Tupletype, &varnames,		/* These are new */
			&filename, &name))
		return NULL;
	return (object *)newcodeobject(argcount, nlocals, flags,
		code, consts, names, varnames, filename, name);
#endif
}

static char new_module_doc[] =
"Create a module object from (NAME).";

static object *
new_module(unused, args)
	object* unused;
	object* args;
{
	char *name;
  
	if (!newgetargs(args, "s", &name))
		return NULL;
	return newmoduleobject(name);
}

static char new_class_doc[] =
"Create a class object from (NAME, BASE_CLASSES, DICT).";

static object *
new_class(unused, args)
	object* unused;
	object* args;
{
	object * name;
	object * classes;
	object * dict;
  
	if (!newgetargs(args, "SO!O!", &name, &Tupletype, &classes,
			&Mappingtype, &dict))
		return NULL;
	return newclassobject(classes, dict, name);
}

static struct methodlist new_methods[] = {
	{"instance",		new_instance,		1, new_instance_doc},
	{"instancemethod",	new_instancemethod,	1, new_im_doc},
#if 0
	{"function",		new_function,		1, new_function_doc},
#endif
	{"code",		new_code,		1, new_code_doc},
	{"module",		new_module,		1, new_module_doc},
	{"classobj",		new_class,		1, new_class_doc},
	{NULL,			NULL}		/* sentinel */
};

char new_doc[] =
"Functions to create new objects used by the interpreter.\n\
\n\
You need to know a great deal about the interpreter to use this!";

void
initnew()
{
	initmodule4("new", new_methods, new_doc, (object *)NULL,
		    PYTHON_API_VERSION);
}
