213 lines
5.2 KiB
C
213 lines
5.2 KiB
C
/***********************************************************
|
|
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);
|
|
}
|