Fixed a bug with clos method, and generating constructors.
git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@9687 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
parent
8c989f8fe3
commit
4beedd3f04
1 changed files with 65 additions and 16 deletions
|
|
@ -47,6 +47,7 @@ public:
|
||||||
private:
|
private:
|
||||||
void emit_defun(Node *n, String *name);
|
void emit_defun(Node *n, String *name);
|
||||||
void emit_defmethod(Node *n);
|
void emit_defmethod(Node *n);
|
||||||
|
void emit_initialize_instance(Node *n);
|
||||||
void emit_getter(Node *n);
|
void emit_getter(Node *n);
|
||||||
void emit_setter(Node *n);
|
void emit_setter(Node *n);
|
||||||
void emit_class(Node *n);
|
void emit_class(Node *n);
|
||||||
|
|
@ -212,7 +213,7 @@ int CFFI::constructorHandler(Node *n) {
|
||||||
Printf(stderr, "constructor %s\n", Getattr(n, "name"));
|
Printf(stderr, "constructor %s\n", Getattr(n, "name"));
|
||||||
Printf(stderr, "constructor %s\n and %s and %s", Getattr(n, "kind"), Getattr(n, "sym:name"), Getattr(n, "allegrocl:old-sym:name"));
|
Printf(stderr, "constructor %s\n and %s and %s", Getattr(n, "kind"), Getattr(n, "sym:name"), Getattr(n, "allegrocl:old-sym:name"));
|
||||||
#endif
|
#endif
|
||||||
|
Setattr(n, "cffi:constructorfunction", "1");
|
||||||
// Let SWIG generate a global forwarding function.
|
// Let SWIG generate a global forwarding function.
|
||||||
return Language::constructorHandler(n);
|
return Language::constructorHandler(n);
|
||||||
}
|
}
|
||||||
|
|
@ -233,15 +234,67 @@ void CFFI::emit_defmethod(Node *n) {
|
||||||
ParmList *pl = Getattr(n, "parms");
|
ParmList *pl = Getattr(n, "parms");
|
||||||
int argnum = 0;
|
int argnum = 0;
|
||||||
Node *parent = parentNode(n);
|
Node *parent = parentNode(n);
|
||||||
|
bool first = 0;
|
||||||
|
|
||||||
for (Parm *p = pl; p; p = nextSibling(p), argnum++) {
|
for (Parm *p = pl; p; p = nextSibling(p), argnum++) {
|
||||||
|
|
||||||
String *argname = Getattr(p, "name");
|
String *argname = Getattr(p, "name");
|
||||||
String *ffitype = Swig_typemap_lookup_new("lispclass", p, "", 0);
|
String *ffitype = Swig_typemap_lookup_new("lispclass", p, "", 0);
|
||||||
|
|
||||||
|
|
||||||
int tempargname = 0;
|
int tempargname = 0;
|
||||||
|
|
||||||
|
if(!first)
|
||||||
|
first = true;
|
||||||
|
else
|
||||||
|
Printf(args_placeholder, " ");
|
||||||
|
|
||||||
|
if (!argname) {
|
||||||
|
argname = NewStringf("arg%d", argnum);
|
||||||
|
tempargname = 1;
|
||||||
|
} else if (Strcmp(argname, "t") == 0 || Strcmp(argname, "T") == 0) {
|
||||||
|
argname = NewStringf("t-arg%d", argnum);
|
||||||
|
tempargname = 1;
|
||||||
|
}
|
||||||
|
if (Len(ffitype) > 0)
|
||||||
|
Printf(args_placeholder, "(%s %s)", argname, ffitype);
|
||||||
|
else
|
||||||
|
Printf(args_placeholder, "%s", argname, ffitype);
|
||||||
|
|
||||||
|
if (Strcmp(ffitype, lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'classname")) == 0)
|
||||||
|
Printf(args_call, " (ff-pointer %s)", argname);
|
||||||
|
else
|
||||||
|
Printf(args_call, " %s", argname);
|
||||||
|
|
||||||
|
Delete(ffitype);
|
||||||
|
|
||||||
|
if (tempargname)
|
||||||
|
Delete(argname);
|
||||||
|
}
|
||||||
|
|
||||||
|
String *method_name = Getattr(n, "name");
|
||||||
|
int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); //
|
||||||
|
|
||||||
|
if (x == 1)
|
||||||
|
Printf(f_clos, "(cl:shadow \"%s\")\n", method_name);
|
||||||
|
|
||||||
|
Printf(f_clos, "(clos:defmethod %s (%s)\n (%s%s))\n\n",
|
||||||
|
lispify_name(n, lispy_name(Char(method_name)), "'method"), args_placeholder,
|
||||||
|
lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CFFI::emit_initialize_instance(Node *n) {
|
||||||
|
String *args_placeholder = NewStringf("");
|
||||||
|
String *args_call = NewStringf("");
|
||||||
|
|
||||||
|
ParmList *pl = Getattr(n, "parms");
|
||||||
|
int argnum = 0;
|
||||||
|
Node *parent = parentNode(n);
|
||||||
|
|
||||||
|
for (Parm *p = pl; p; p = nextSibling(p), argnum++) {
|
||||||
|
String *argname = Getattr(p, "name");
|
||||||
|
String *ffitype = Swig_typemap_lookup_new("lispclass", p, "", 0);
|
||||||
|
|
||||||
|
int tempargname = 0;
|
||||||
if (!argname) {
|
if (!argname) {
|
||||||
argname = NewStringf("arg%d", argnum);
|
argname = NewStringf("arg%d", argnum);
|
||||||
tempargname = 1;
|
tempargname = 1;
|
||||||
|
|
@ -265,16 +318,9 @@ void CFFI::emit_defmethod(Node *n) {
|
||||||
Delete(argname);
|
Delete(argname);
|
||||||
}
|
}
|
||||||
|
|
||||||
String *method_name = Getattr(n, "name");
|
Printf(f_clos, "(clos:defmethod initialize-instance :after ((obj %s) &key%s)\n (setf (slot-value obj 'ff-pointer) (%s%s))\n\n",
|
||||||
int x = Replace(method_name, "operator ", "", DOH_REPLACE_FIRST); //
|
lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), args_placeholder,
|
||||||
|
lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call);
|
||||||
if (x == 1)
|
|
||||||
Printf(f_clos, "(cl:shadow \"%s\")\n", method_name);
|
|
||||||
|
|
||||||
Printf(f_clos, "(clos:defmethod %s ((obj %s)%s)\n (%s (ff-pointer obj)%s))\n\n",
|
|
||||||
lispify_name(n, lispy_name(Char(method_name)), "'method"),
|
|
||||||
lispify_name(parent, lispy_name(Char(Getattr(parent, "sym:name"))), "'class"), args_placeholder,
|
|
||||||
lispify_name(n, Getattr(n, "sym:name"), "'function"), args_call);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -413,9 +459,12 @@ int CFFI::functionWrapper(Node *n) {
|
||||||
emit_defmethod(n);
|
emit_defmethod(n);
|
||||||
else if (Getattr(n, "cffi:membervariable")) {
|
else if (Getattr(n, "cffi:membervariable")) {
|
||||||
if (Getattr(n, "memberget"))
|
if (Getattr(n, "memberget"))
|
||||||
emit_getter(n);
|
emit_getter(n);
|
||||||
else if (Getattr(n, "memberset"))
|
else if (Getattr(n, "memberset"))
|
||||||
emit_setter(n);
|
emit_setter(n);
|
||||||
|
}
|
||||||
|
else if (Getattr(n, "cffi:constructorfunction")) {
|
||||||
|
emit_initialize_instance(n);
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
emit_defun(n, iname);
|
emit_defun(n, iname);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue