02/27/2006: mutandiz

[allegrocl]
	    Add support for INPUT, OUTPUT, and INOUT typemaps.
	    For OUTPUT variables, the lisp wrapper returns multiple
	    values.


git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8911 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Mikel Bancroft 2006-02-27 21:45:07 +00:00
commit 6ee4d72a10
8 changed files with 479 additions and 40 deletions

View file

@ -444,6 +444,21 @@ Version 1.3.28 (February 12, 2006)
SWIG_exception(SWIG_RuntimeError,"unknown exception"); SWIG_exception(SWIG_RuntimeError,"unknown exception");
} }
01/09/2006: mutandiz
[Allegrocl]
Fixes a number of SEGVs primarily in the handling of
various anonymous types. Found in a pass through the
swig test-suite. Still more to do here, but this is a
good checkpoint.
Adds -cwrap and -nocwrap as an allegrocl specific
command-line argument. Controls generating of a C
wrapper file when wrapping C code. By default only a
lisp file is created for C code wrapping.
Doc updates for the command-line arguments and fixes as
pointed out on swig-devel
01/05/2006: wsfulton 01/05/2006: wsfulton
[Java] Fix unsigned long long and const unsigned long long & typemaps [Java] Fix unsigned long long and const unsigned long long & typemaps

View file

@ -1,5 +1,11 @@
Version 1.3.29 (In progress) Version 1.3.29 (In progress)
============================ ============================
02/27/2006: mutandiz
[allegrocl]
Add support for INPUT, OUTPUT, and INOUT typemaps.
For OUTPUT variables, the lisp wrapper returns multiple
values.
02/26/2006: mmatus 02/26/2006: mmatus
[Ruby] add argcargv.i library file. [Ruby] add argcargv.i library file.

View file

@ -1793,6 +1793,11 @@ return-val wrapper-name(parm0, parm1, ..., parmN)
<li><tt>$out</tt> - expands to the name of the local variable <li><tt>$out</tt> - expands to the name of the local variable
assigned to this typemap assigned to this typemap
</li> </li>
<li><tt>$in_fftype</tt> - the foreign function type of the C type.</li>
<li><tt>$*in_fftype</tt> - the foreign function type of the C type
with one pointer removed. If there is no pointer, then $*in_fftype
is the same as $in_fftype.
</li>
<li><tt>$body</tt> - very important. Instructs SWIG where <li><tt>$body</tt> - very important. Instructs SWIG where
subsequent code generation steps should be inserted into the subsequent code generation steps should be inserted into the
current typemap. Leaving out a <tt>$body</tt> reference current typemap. Leaving out a <tt>$body</tt> reference

View file

@ -10,10 +10,331 @@ srcdir = @srcdir@
top_srcdir = @top_srcdir@ top_srcdir = @top_srcdir@
top_builddir = @top_builddir@ top_builddir = @top_builddir@
include $(srcdir)/../common.mk # include $(srcdir)/../common.mk
#CPP_TEST_CASES += # these cpp tests aren't working. Fix 'em
#C_TEST_CASES += # need to further separate these into tests requiring
# std libraries, or the $ldestructor problem.
CPP_TEST_BROKEN_ACL = \
array_member \
char_strings \
class_ignore \
constant_pointers \
contract \
cplusplus_throw \
cpp_basic \
cpp_enum \
cpp_typedef \
default_constructor \
default_args \
dynamic_cast \
enum_thorough \
extend_variable \
global_vars \
import_nomodule \
kind \
li_carrays \
li_cdata \
li_windows \
namespace_class \
namespace_spaces \
naturalvar \
operator_overload \
overload_simple \
register_par \
sizet \
smart_pointer_extend \
smart_pointer_namespace \
template \
template_classes \
template_default \
template_default_inherit \
template_enum \
template_explicit \
template_extend_overload \
template_ns \
template_ns4 \
template_ns_enum \
template_rename \
template_retvalue \
template_static \
template_tbase_template \
template_typedef \
template_typedef_cplx \
template_typedef_cplx2 \
template_typedef_cplx3 \
template_typedef_cplx4 \
template_typedef_cplx5 \
template_typedef_ns \
template_typedef_rec \
threads \
typedef_array_member \
typedef_sizet \
typemap_namespace \
union_scope \
using_pointers \
valuewrapper_opaque \
varargs \
virtual_poly \
voidtest \
wrapmacro
# these aren't working due to longlong support. (low hanging fruit)
CPP_TEST_BROKEN_LONGLONG = \
arrays_dimensionless \
arrays_global \
arrays_global_twodim \
li_stdint \
li_typemaps \
long_long_apply \
mixed_types \
primitive_ref \
reference_global_vars \
template_default_arg
# These are currently unsupported.
CPP_TEST_CASES_ACL_UNSUPPORTED = \
aggregate \
contract \
director_abstract \
director_basic \
director_constructor \
director_detect \
director_default \
director_enum \
director_exception \
director_frob \
director_finalizer \
director_nested \
director_protected \
director_redefined \
director_unroll \
director_using \
director_wombat \
exception_order \
extern_throws \
throw_exception
# C++ test cases. (Can be run individually using make testcase.cpptest.)
CPP_TEST_CASES = \
abstract_access \
abstract_inherit \
abstract_inherit_ok \
abstract_signature \
abstract_typedef \
abstract_typedef2 \
abstract_virtual \
access_change \
add_link \
allowexcept \
anonymous_bitfield \
argout \
array_typedef_memberin \
arrayref \
arrays_scope \
bloody_hell \
bools \
casts \
cast_operator \
class_scope_weird \
const_const_2 \
constover \
constructor_copy \
constructor_exception \
constructor_explicit \
constructor_value \
compactdefaultargs \
conversion \
conversion_namespace \
conversion_ns_template \
cpp_namespace \
cpp_nodefault \
cpp_static \
defvalue_constructor \
derived_byvalue \
derived_nested \
destructor_reprotected \
disown \
empty \
enum_plus \
enum_scope_template \
enum_template \
enum_var \
evil_diamond \
evil_diamond_ns \
evil_diamond_prop \
extend_default \
extend_placement \
extend_template \
extend_template_ns \
extern_namespace \
features \
friends \
global_ns_arg \
grouping \
ignore_parameter \
inherit \
inherit_missing \
inherit_same_name \
inherit_void_arg \
inline_initializer \
langobj \
li_attribute \
li_cpointer \
member_template \
minherit \
multiple_inheritance \
name_cxx \
name_warnings \
namespace_enum \
namespace_extend \
namespace_nested \
namespace_template \
namespace_typedef_class \
namespace_typemap \
namespace_virtual_method \
newobject1 \
ordering \
overload_copy \
overload_extend \
overload_rename \
overload_subtype \
overload_template \
overload_template_fast \
pointer_reference \
private_assign \
protected_rename \
pure_virtual \
redefined \
refcount \
rename_scope \
return_const_value \
return_value_scope \
rname \
smart_pointer_const \
smart_pointer_const2 \
smart_pointer_member \
smart_pointer_multi \
smart_pointer_multi_typedef \
smart_pointer_namespace2 \
smart_pointer_not \
smart_pointer_overload \
smart_pointer_protected \
smart_pointer_rename \
smart_pointer_simple \
smart_pointer_static \
smart_pointer_typedef \
static_array_member \
static_const_member \
static_const_member_2 \
struct_value \
template_array_numeric \
template_arg_replace \
template_arg_scope \
template_arg_typename \
template_base_template \
template_const_ref \
template_construct \
template_default2 \
template_default_qualify \
template_default_vw \
template_enum_ns_inherit \
template_enum_typedef \
template_extend_overload_2 \
template_extend1 \
template_extend2 \
template_forward \
template_inherit \
template_inherit_abstract \
template_int_const \
template_ns2 \
template_ns3 \
template_ns_enum2 \
template_ns_inherit \
template_ns_scope \
template_partial_arg \
template_qualifier \
template_ref_type \
template_specialization \
template_specialization_defarg \
template_specialization_enum \
template_typedef_ptr \
template_using \
template_virtual \
template_whitespace \
typedef_class \
typedef_funcptr \
typedef_inherit \
typedef_mptr \
typedef_reference \
typedef_scope \
typedef_struct \
typemap_ns_using \
typemap_numinputs \
typemap_variables \
typemap_various \
typename \
using1 \
using2 \
using_composition \
using_extend \
using_inherit \
using_namespace \
using_private \
using_protected \
valuewrapper \
valuewrapper_base \
valuewrapper_const \
virtual_destructor
# std lib support hasn't been done yet.
SKIP_CPP_STD_CASES = Yes
C_TEST_CASES_ACL_BROKEN = \
arrays \
enums \
extern_declaration \
immutable \
integers \
li_cdata \
typemap_subst
C_TEST_BROKEN_LONGLONG = \
long_long
C_TEST_CASES = \
char_constant \
const_const \
empty \
function_typedef \
inctest \
lextype \
li_carrays \
li_cmalloc \
li_constraints \
li_cpointer \
li_math \
name \
nested \
newobject2 \
overload_extend \
overload_extendc \
preproc \
ret_by_value \
sizeof_pointer \
sneaky1 \
struct_rename \
typedef_struct \
unions
NOT_BROKEN_TEST_CASES = $(CPP_TEST_CASES:=.cpptest) \
$(C_TEST_CASES:=.ctest) \
$(MULTI_CPP_TEST_CASES:=.multicpptest) \
$(CUSTOM_TEST_CASES:=.customtest)
check: $(NOT_BROKEN_TEST_CASES)
include $(srcdir)/../common.mk
# Rules for the different types of tests # Rules for the different types of tests
%.cpptest: %.cpptest:

View file

@ -7,17 +7,19 @@
%ffargs(strings_convert="t"); %ffargs(strings_convert="t");
/* typemaps for argument and result type conversions. */ /* typemaps for argument and result type conversions. */
%typemap(lin) SWIGTYPE "(let (($out $in))\n $body)"; %typemap(lin,numinputs=1) SWIGTYPE "(let (($out $in))\n $body)";
%typemap(lout) bool, char, unsigned char, signed char, %typemap(lout) bool, char, unsigned char, signed char,
short, signed short, unsigned short, short, signed short, unsigned short,
int, signed int, unsigned int, int, signed int, unsigned int,
long, signed long, unsigned long, long, signed long, unsigned long,
float, double, long double, char *, void *, void, float, double, long double, char *, void *,
enum SWIGTYPE "$body"; enum SWIGTYPE "(push $body ACL_result)";
%typemap(lout) void "$body";
%typemap(lout) SWIGTYPE[ANY], SWIGTYPE *, %typemap(lout) SWIGTYPE[ANY], SWIGTYPE *,
SWIGTYPE & "(make-instance '$lclass :foreign-address $body)"; SWIGTYPE & "(push (make-instance '$lclass :foreign-address $body) ACL_result)";
%typemap(lout) SWIGTYPE "(let* ((address $body)\n (ACL_result (make-instance '$lclass :foreign-address address)))\n (unless (zerop address)\n (excl:schedule-finalization ACL_result #'$ldestructor))\n ACL_result)";
%typemap(lout) SWIGTYPE "(let* ((address $body)\n (new-inst (make-instance '$lclass :foreign-address address)))\n (unless (zerop address)\n (excl:schedule-finalization ACL_result #'$ldestructor))\n (push new-inst ACL_result))";
%typemap(lisptype) bool "boolean"; %typemap(lisptype) bool "boolean";
%typemap(lisptype) char "character"; %typemap(lisptype) char "character";
@ -154,15 +156,15 @@ SWIG_TYPECHECK_STRING_ARRAY 1140
%typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; }; %typecheck(SWIG_TYPECHECK_UNICHAR) wchar_t { $1 = 1; };
%typemap(in) wchar_t "$1 = $input;"; %typemap(in) wchar_t "$1 = $input;";
%typemap(lin) wchar_t "(let (($out (char-code $in)))\n $body)"; %typemap(lin,numinputs=1) wchar_t "(let (($out (char-code $in)))\n $body)";
%typemap(lin) wchar_t* "(excl:with-native-string ($out $in %typemap(lin,numinputs=1) wchar_t* "(excl:with-native-string ($out $in
:external-format #+little-endian :fat-le #-little-endian :fat)\n :external-format #+little-endian :fat-le #-little-endian :fat)\n
$body)" $body)"
%typemap(out) wchar_t "$result = $1;"; %typemap(out) wchar_t "$result = $1;";
%typemap(lout) wchar_t "(code-char $body)"; %typemap(lout) wchar_t "(push (code-char $body) ACL_result)";
%typemap(lout) wchar_t* "(excl:native-to-string $body %typemap(lout) wchar_t* "(push (excl:native-to-string $body
:external-format #+little-endian :fat-le #-little-endian :fat)"; :external-format #+little-endian :fat-le #-little-endian :fat) ACL_result)";
%typemap(ffitype) wchar_t ":unsigned-short"; %typemap(ffitype) wchar_t ":unsigned-short";
%typemap(lisptype) wchar_t ""; %typemap(lisptype) wchar_t "";
@ -342,7 +344,7 @@ $body)"
(defmacro swig-defun ((name &optional (mangled-name name) (defmacro swig-defun ((name &optional (mangled-name name)
&key (type :operator) class arity) &key (type :operator) class arity)
ffargs kwargs arglist kwargs
&body body) &body body)
(let* ((symbol (id-convert-and-export name :type type (let* ((symbol (id-convert-and-export name :type type
:arity arity :class class)) :arity arity :class class))
@ -355,9 +357,13 @@ $body)"
else (intern mangled-name))) else (intern mangled-name)))
(defun-args (maybe-reorder-args (defun-args (maybe-reorder-args
symbol symbol
(mapcar #'car (and (not (equal ffargs '(:void))) (mapcar #'car (and (not (equal arglist '(:void)))
ffargs)) (loop as i in arglist
)) when (eq (car i) :p+)
collect (cdr i))))))
(ffargs (if (equal arglist '(:void))
arglist
(mapcar #'cdr arglist)))
) )
(when (swig-anyvarargs-p ffargs) (when (swig-anyvarargs-p ffargs)
(setq ffargs '())) (setq ffargs '()))
@ -380,11 +386,12 @@ $body)"
(defmethod-args (maybe-reorder-args (defmethod-args (maybe-reorder-args
symbol symbol
(unless (equal ffargs '(:void)) (unless (equal ffargs '(:void))
(loop for (name dispatch) in ffargs (loop for (lisparg name dispatch) in ffargs
when (eq lisparg :p+)
collect `(,name ,dispatch))))) collect `(,name ,dispatch)))))
(ffargs (if (equal ffargs '(:void)) (ffargs (if (equal ffargs '(:void))
ffargs ffargs
(loop for (name nil . ffi) in ffargs (loop for (nil name nil . ffi) in ffargs
collect `(,name ,@ffi))))) collect `(,name ,@ffi)))))
`(eval-when (compile load eval) `(eval-when (compile load eval)
(excl::compiler-let ((*record-xref-info* nil)) (excl::compiler-let ((*record-xref-info* nil))

View file

@ -8,7 +8,7 @@
*/ */
%typemap(in) long long, unsigned long long "$1 = $input;"; %typemap(in) long long, unsigned long long "$1 = $input;";
%typemap(out) long long, unsigned long long "$result = $1;"; %typemap(out) long long, unsigned long long "$result = &$1;";
%typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))"; %typemap(ffitype) long long "(:struct (l1 :long) (l2 :long))";
%typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long) %typemap(ffitype) unsigned long long "(:struct (l1 :unsigned-long)

View file

@ -1 +1,5 @@
/* Unused for Allegro CL module */ /* Unused for Allegro CL module */
%include "inout_typemaps.i"
%include "wchar_t.i"
%include "longlongs.i"

View file

@ -626,12 +626,15 @@ String *get_ffi_type(SwigType *ty, const String_or_char *name) {
into lisp code to generate the def-foreign-type name */ into lisp code to generate the def-foreign-type name */
#ifdef ALLEGROCL_TYPE_DEBUG #ifdef ALLEGROCL_TYPE_DEBUG
Printf(stderr, "inside g_f_t: looking up %s\n", ty); Printf(stderr, "inside g_f_t: looking up '%s' '%s'\n", ty, name);
#endif #endif
String *found_type = lookup_defined_foreign_type(ty); String *found_type = lookup_defined_foreign_type(ty);
if (found_type) { if (found_type) {
#ifdef ALLEGROCL_TYPE_DEBUG
Printf(stderr, "found_type '%s'\n", found_type);
#endif
return (Strcmp(found_type,"forward-reference") ? return (Strcmp(found_type,"forward-reference") ?
Copy(found_type) : NewString(":void")); Copy(found_type) : NewString(":void"));
} else { } else {
@ -640,6 +643,9 @@ String *get_ffi_type(SwigType *ty, const String_or_char *name) {
if (typemap) { if (typemap) {
String *typespec = Getattr(typemap, "code"); String *typespec = Getattr(typemap, "code");
#ifdef ALLEGROCL_TYPE_DEBUG
Printf(stderr, "found typemap '%s'\n", typespec);
#endif
return NewString(typespec); return NewString(typespec);
} }
@ -1066,9 +1072,10 @@ void emit_full_class(Node *n) {
(!storage_type || Strcmp(storage_type,"typedef")))) { (!storage_type || Strcmp(storage_type,"typedef")))) {
String *access = Getattr(c,"access"); String *access = Getattr(c,"access");
// hack. why would decl have a value of "variableHandler"? // hack. why would decl have a value of "variableHandler" and now "0"?
String *childDecl = Getattr(c,"decl"); String *childDecl = Getattr(c,"decl");
if(!Strcmp(childDecl,"variableHandler")) // Printf(stderr,"childDecl = '%s' (%s)\n", childDecl, Getattr(c,"view"));
if(!Strcmp(childDecl,"0"))
childDecl = NewString(""); childDecl = NewString("");
SwigType *childType=NewStringf("%s%s", childDecl, SwigType *childType=NewStringf("%s%s", childDecl,
@ -1487,6 +1494,8 @@ int ALLEGROCL :: top(Node *n) {
" (:use :common-lisp :swig :ff :excl))\n\n", " (:use :common-lisp :swig :ff :excl))\n\n",
module); module);
// Swig_print_tree(n);
Language::top(n); Language::top(n);
// SwigType_emit_type_table(f_cxx,f_cxx_wrapper); // SwigType_emit_type_table(f_cxx,f_cxx_wrapper);
@ -1838,6 +1847,39 @@ Node *parent_node_skipping_extends(Node* n)
return result; return result;
} }
/* -----------------------------------------------------------------------------
* emit_num_lin_arguments()
*
* Calculate the total number of arguments. This function is safe for use
* with multi-valued typemaps which may change the number of arguments in
* strange ways.
* ----------------------------------------------------------------------------- */
int emit_num_lin_arguments(ParmList *parms) {
Parm *p = parms;
int nargs = 0;
while (p) {
// Printf(stderr,"enla: '%s' lin='%x'\n", Getattr(p,"name"), Getattr(p,"tmap:lin"));
if (Getattr(p,"tmap:lin")) {
nargs += GetInt(p,"tmap:lin:numinputs");
p = Getattr(p,"tmap:lin:next");
} else {
p = nextSibling(p);
}
}
/* DB 04/02/2003: Not sure this is necessary with tmap:in:numinputs */
/*
if (parms && (p = Getattr(parms,"emit:varargs"))) {
if (!nextSibling(p)) {
nargs--;
}
}
*/
return nargs;
}
String *id_converter_type(SwigType const *type) String *id_converter_type(SwigType const *type)
{ {
SwigType *t = Copy(type); SwigType *t = Copy(type);
@ -1942,6 +1984,12 @@ static ParmList *parmlist_with_names(ParmList *pl)
Setattr(p2, "name", Getattr(p2, "lname")); Setattr(p2, "name", Getattr(p2, "lname"));
Setattr(p2, "name", strip_namespaces(Getattr(p2, "name"))); Setattr(p2, "name", strip_namespaces(Getattr(p2, "name")));
Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype")); Setattr(p2, "tmap:ctype", Getattr(p, "tmap:ctype"));
String *temp = Getattr(p,"tmap:lin");
if (temp) {
Setattr(p2, "tmap:lin", temp);
Setattr(p2, "tmap:lin:next", Getattr(p,"tmap:lin:next"));
}
} }
return pl2; return pl2;
} }
@ -2059,7 +2107,8 @@ IDargs* id_converter_arguments(Node *n)
if (Getattr(n, "sym:overloaded")) { if (Getattr(n, "sym:overloaded")) {
if(result->arity) Delete(result->arity); if(result->arity) Delete(result->arity);
result->arity = NewStringf("%d", result->arity = NewStringf("%d",
emit_num_arguments(Getattr(n, "wrap:parms"))); // emit_num_arguments(Getattr(n, "wrap:parms")));
emit_num_lin_arguments(Getattr(n, "wrap:parms")));
} }
SetVoid(n, "allegrocl:id-converter-args", result); SetVoid(n, "allegrocl:id-converter-args", result);
@ -2158,7 +2207,7 @@ int ALLEGROCL :: emit_dispatch_defun(Node *n) {
int last_arity = -1; int last_arity = -1;
for (Iterator i = First(overloads); i.item; i = Next(i)) { for (Iterator i = First(overloads); i.item; i = Next(i)) {
int arity = emit_num_arguments(Getattr(i.item, "wrap:parms")); int arity = emit_num_lin_arguments(Getattr(i.item, "wrap:parms"));
if (arity == last_arity) continue; if (arity == last_arity) continue;
Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity); Printf(f_clwrap, "%s%d", last_arity == -1 ? "" : " ", arity);
@ -2200,10 +2249,11 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
// attach typemap info. // attach typemap info.
Wrapper *wrap = NewWrapper(); Wrapper *wrap = NewWrapper();
Swig_typemap_attach_parms("lin", pl, wrap); Swig_typemap_attach_parms("lin", pl, wrap);
// Swig_typemap_attach_parms("in", pl, wrap);
Swig_typemap_lookup_new("lout",n,"result",0); Swig_typemap_lookup_new("lout",n,"result",0);
// prime the pump. // prime the pump, with support for OUTPUT, INOUT typemaps.
Printf(wrap->code,"$body"); Printf(wrap->code,"(let (ACL_result)\n $body\n (values-list ACL_result))");
Parm *p; Parm *p;
int largnum = 0, argnum=0, first=1; int largnum = 0, argnum=0, first=1;
@ -2224,7 +2274,8 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
// Just C // Just C
else else
{ {
Printf(f_cl, "(swig-defun (\"%s\")\n", funcname); Printf(f_cl, "(swig-defun (\"%s\" \"%s\")\n", funcname,
Generate_Wrapper ? mangled_name : "");
} }
////////////////////////////////////// //////////////////////////////////////
@ -2243,7 +2294,8 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
String *largs = NewString(""); String *largs = NewString("");
for (p=pl; p; p=nextSibling(p), argnum++, largnum++) { for (p=pl; p; p=nextSibling(p), argnum++, largnum++) {
SwigType *argtype=Getattr(p, "type"); // SwigType *argtype=Getattr(p, "type");
SwigType *argtype = Swig_cparse_type(Getattr(p,"tmap:ctype"));
if (!first) { if (!first) {
Printf(f_cl, "\n "); Printf(f_cl, "\n ");
@ -2254,8 +2306,20 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
} else { } else {
String *argname=NewStringf("PARM%d_%s", largnum, Getattr(p, "name")); String *argname=NewStringf("PARM%d_%s", largnum, Getattr(p, "name"));
// String *ffitype=get_ffi_type(argtype, argname); String *ffitype = compose_foreign_type(argtype);
String *ffitype=compose_foreign_type(argtype);
String *deref_ffitype;
String *temp = Copy(argtype);
if(SwigType_ispointer(temp)) {
SwigType_pop(temp);
deref_ffitype = compose_foreign_type(temp);
} else {
deref_ffitype = Copy(ffitype);
}
Delete(temp);
String *lisptype=get_lisp_type(argtype, argname); String *lisptype=get_lisp_type(argtype, argname);
// while we're walking the parameters, generating LIN // while we're walking the parameters, generating LIN
@ -2269,7 +2333,8 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
Printf(largs," %s",lname); Printf(largs," %s",lname);
Replaceall(parm_code,"$in", argname); Replaceall(parm_code,"$in", argname);
Replaceall(parm_code,"$out", lname); Replaceall(parm_code,"$out", lname);
Replaceall(parm_code,"$in_fftype", ffitype);
Replaceall(parm_code,"$*in_fftype", deref_ffitype);
Replaceall(wrap->code,"$body", parm_code); Replaceall(wrap->code,"$body", parm_code);
} }
@ -2277,8 +2342,16 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
dispatching_type(p) : dispatching_type(p) :
NewString(""); NewString("");
Printf(f_cl, "(%s %s %s %s)", argname, dispatchtype, ffitype, lisptype); // if this parameter has been removed from the C/++ wrapper
first=0; // it shouldn't be in the lisp wrapper either.
if(!checkAttribute(p,"tmap:in:numinputs","0")) {
Printf(f_cl, "(%s %s %s %s %s)",
// parms in the ff wrapper, but not in the lisp wrapper.
(checkAttribute(p,"tmap:lin:numinputs","0") ? ":p-" : ":p+"),
argname, dispatchtype, ffitype, lisptype);
first=0;
}
Delete(ffitype); Delete(ffitype);
Delete(lisptype); Delete(lisptype);
@ -2329,8 +2402,11 @@ int ALLEGROCL :: emit_defun(Node *n, File *f_cl) {
// Getattr(n,"name"), cl_t); // Getattr(n,"name"), cl_t);
// } // }
Replaceall(wrap->code,"$body", NewStringf("(swig-ff-call%s)", Replaceall(wrap->code,"$body", NewStringf("(swig-ff-call%s)", wrap->locals));
wrap->locals)); // Replaceall(wrap->code,"$body",
// (!Strcmp(result_type,"void") ?
// NewStringf("(swig-ff-call%s)", wrap->locals) :
// NewStringf("(push (swig-ff-call%s) ACL_result)", wrap->locals)));
String* ldestructor = Copy(lclass); String* ldestructor = Copy(lclass);
if (ff_foreign_ptr) if (ff_foreign_ptr)
Replaceall(ldestructor, ldestructor, "identity"); Replaceall(ldestructor, ldestructor, "identity");
@ -2402,6 +2478,7 @@ int ALLEGROCL :: functionWrapper(Node *n) {
// Attach the standard typemaps // Attach the standard typemaps
Swig_typemap_attach_parms("ctype", parms, wrap); Swig_typemap_attach_parms("ctype", parms, wrap);
Swig_typemap_attach_parms("lin", parms, wrap);
emit_attach_parmmaps(parms, wrap); emit_attach_parmmaps(parms, wrap);
String *mangled = mangle_name(n); String *mangled = mangle_name(n);
@ -2442,10 +2519,12 @@ int ALLEGROCL :: functionWrapper(Node *n) {
int i; Parm *p; int i; Parm *p;
for (i = 0, p=parms; i < num_arguments; i++) { for (i = 0, p=parms; i < num_arguments; i++) {
while (checkAttribute(p,"tmap:in:numinputs","0")) { while (p && checkAttribute(p,"tmap:in:numinputs","0")) {
p = Getattr(p,"tmap:in:next"); p = Getattr(p,"tmap:in:next");
} }
if(!p) break;
SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype")); SwigType *c_parm_type = Swig_cparse_type(Getattr(p, "tmap:ctype"));
String *arg = NewStringf("l%s", Getattr(p,"lname")); String *arg = NewStringf("l%s", Getattr(p,"lname"));
@ -2868,6 +2947,8 @@ int ALLEGROCL :: cppClassHandler(Node *n) {
Getattr(c,"type")); Getattr(c,"type"));
if(!SwigType_isfunction(childType)) if(!SwigType_isfunction(childType))
Delete(compose_foreign_type(childType)); Delete(compose_foreign_type(childType));
Delete(childType);
} }
#ifdef ALLEGROCL_CLASS_DEBUG #ifdef ALLEGROCL_CLASS_DEBUG
Printf(stderr, " MANUAL walk DONE.\n"); Printf(stderr, " MANUAL walk DONE.\n");