From: John L. <wu...@us...> - 2005-04-05 20:40:10
|
Update of /cvsroot/swig/SWIG/Source/Modules In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30795/Source/Modules Modified Files: chicken.cxx Log Message: Some chicken bug fixes for overloaded -proxy methods Index: chicken.cxx =================================================================== RCS file: /cvsroot/swig/SWIG/Source/Modules/chicken.cxx,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** chicken.cxx 5 Apr 2005 17:48:31 -0000 1.37 --- chicken.cxx 5 Apr 2005 20:39:57 -0000 1.38 *************** *** 36,39 **** --- 36,40 ---- -unhideprimitive - Unhide the primitive: symbols\n\ -nounit - Do not (declare (unit ...)) in scheme file\n\ + -noclosuses - Do not (declare (uses ...)) in scheme file\n\ -nocollection - Do not register pointers with chicken garbage\n\ collector and export destructors\n\ *************** *** 60,63 **** --- 61,65 ---- static int declare_unit = 1; static int no_collection = 0; + static int clos_uses = 1; /* C++ Support + Clos Classes */ *************** *** 117,121 **** String *runtimeCode(); String *defaultExternalRuntimeFilename(); ! String *buildClosFunctionCall(List *types, char *format, String_or_char *funcName, int method_specialize); }; --- 119,123 ---- String *runtimeCode(); String *defaultExternalRuntimeFilename(); ! String *buildClosFunctionCall(List *types, String_or_char *closname, String_or_char *funcname); }; *************** *** 181,184 **** --- 183,189 ---- declare_unit = 0; Swig_mark_arg(i); + } else if (strcmp(argv[i],"-noclosuses") == 0) { + clos_uses = 0; + Swig_mark_arg(i); } else if (strcmp(argv[i],"-nocollection") == 0) { no_collection = 1; *************** *** 288,292 **** Printv(f_scm,"(declare (unit ", scmmodule, "))\n\n", NIL); Printv(f_scm,"(declare \n", ! tab4, "(hide swig-init)\n", tab4, "(foreign-declare \"C_extern void swig_", module, "_init(C_word,C_word,C_word) C_noret;\"))\n", NIL); Printv(f_scm,"(define swig-init (##core#primitive \"swig_", module, --- 293,297 ---- Printv(f_scm,"(declare (unit ", scmmodule, "))\n\n", NIL); Printv(f_scm,"(declare \n", ! tab4, "(hide swig-init swig-init-return)\n", tab4, "(foreign-declare \"C_extern void swig_", module, "_init(C_word,C_word,C_word) C_noret;\"))\n", NIL); Printv(f_scm,"(define swig-init (##core#primitive \"swig_", module, *************** *** 470,474 **** Delete(class_name); } else { ! Append(function_arg_types, "^^##primitive$$"); } } --- 475,479 ---- Delete(class_name); } else { ! Append(function_arg_types, "<top>"); } } *************** *** 632,645 **** if (!any_specialized_arg) { method_def = NewString(""); ! Printv(method_def, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")\n", NIL); } else { ! String *fmt = NewStringf("(define-method (%s %%s) %%s)\n", clos_name); ! method_def = buildClosFunctionCall(function_arg_types, ! Char(fmt), ! chickenPrimitiveName(scmname), ! 1); ! Delete(fmt); } ! Printv(clos_methods, method_def, NIL); Delete(clos_name); Delete(method_def); --- 637,645 ---- if (!any_specialized_arg) { method_def = NewString(""); ! Printv(method_def, "(define ", clos_name, " ", chickenPrimitiveName(scmname), ")", NIL); } else { ! method_def = buildClosFunctionCall(function_arg_types, clos_name, chickenPrimitiveName(scmname)); } ! Printv(clos_methods, method_def, "\n", NIL); Delete(clos_name); Delete(method_def); *************** *** 1061,1080 **** " (swig-initialize obj initargs ", NIL); if (constructor_arg_types) { ! String *func_call = buildClosFunctionCall(constructor_arg_types, ! "(lambda (%s) %s)", ! chickenPrimitiveName(constructor_name), ! 0); ! Printf(clos_methods, "%s", func_call); Delete(func_call); Delete(constructor_arg_types); constructor_arg_types = 0; } else if (constructor_dispatch) { ! Printf(clos_methods, "%s", constructor_dispatch); Delete(constructor_dispatch); constructor_dispatch = 0; } else { ! Printf(clos_methods, "%s", chickenPrimitiveName(constructor_name)); } - Printf(clos_methods, ")\n)\n"); Delete(constructor_name); constructor_name = 0; --- 1061,1080 ---- " (swig-initialize obj initargs ", NIL); if (constructor_arg_types) { ! String *initfunc_name = NewStringf("%s@@SWIG@initmethod", class_name); ! String *func_call = buildClosFunctionCall(constructor_arg_types, initfunc_name, chickenPrimitiveName(constructor_name)); ! Printf(clos_methods, "%s)\n)\n", initfunc_name); ! Printf(clos_methods, "(declare (hide %s))\n", initfunc_name); ! Printf(clos_methods, "%s\n", func_call); Delete(func_call); + Delete(initfunc_name); Delete(constructor_arg_types); constructor_arg_types = 0; } else if (constructor_dispatch) { ! Printf(clos_methods, "%s)\n)\n", constructor_dispatch); Delete(constructor_dispatch); constructor_dispatch = 0; } else { ! Printf(clos_methods, "%s)\n)\n", chickenPrimitiveName(constructor_name)); } Delete(constructor_name); constructor_name = 0; *************** *** 1241,1245 **** int CHICKEN::importDirective(Node *n) { String *modname = Getattr(n, "module"); ! if (modname) { // Find the module node for this imported module. It should be the --- 1241,1245 ---- int CHICKEN::importDirective(Node *n) { String *modname = Getattr(n, "module"); ! if (modname && clos_uses) { // Find the module node for this imported module. It should be the *************** *** 1260,1264 **** } ! String *CHICKEN::buildClosFunctionCall(List *types, char *format, String_or_char *funcName, int method_specialize) { String *method_signature = NewString(""); String *func_args = NewString(""); --- 1260,1264 ---- } ! String *CHICKEN::buildClosFunctionCall(List *types, String_or_char *closname, String_or_char *funcname) { String *method_signature = NewString(""); String *func_args = NewString(""); *************** *** 1268,1292 **** int arg_count = 0; int optional_arguments = 0; - int first_argument = 1; for (arg_type = First(types); arg_type.item; arg_type = Next(arg_type)) { if (Strcmp(arg_type.item, "^^##optional$$") == 0) { optional_arguments = 1; - } else if (Strcmp(arg_type.item, "^^##primitive$$") == 0) { - if (first_argument) - Printf(method_signature, " (arg%i <top>)", arg_count); - else - Printf(method_signature, " arg%i", arg_count); - - Printf(func_args, " arg%i", arg_count); - first_argument = 0; } else { ! first_argument = 0; ! if (method_specialize) { ! Printf(method_signature, " (arg%i %s)", arg_count, arg_type.item); } else { ! Printf(method_signature, " arg%i", arg_count); } - Printf(func_args, " (slot-ref arg%i 'swig-this)", arg_count); } arg_count++; --- 1268,1282 ---- int arg_count = 0; int optional_arguments = 0; for (arg_type = First(types); arg_type.item; arg_type = Next(arg_type)) { if (Strcmp(arg_type.item, "^^##optional$$") == 0) { optional_arguments = 1; } else { ! Printf(method_signature, " (arg%i %s)", arg_count, arg_type.item); ! if (Strcmp(arg_type.item, "<top>") == 0) { ! Printf(func_args, " arg%i", arg_count); } else { ! Printf(func_args, " (slot-ref arg%i 'swig-this)", arg_count); } } arg_count++; *************** *** 1294,1310 **** if (optional_arguments) { ! Printf(func_call, "(apply %s %s args)", funcName, func_args); ! Printf(method_signature, " . args"); } else { ! Printf(func_call, "(%s %s)", funcName, func_args); } - String *ret = NewStringf(format, method_signature, func_call); - Delete(method_signature); Delete(func_args); - Delete(func_call); ! return ret; } --- 1284,1298 ---- if (optional_arguments) { ! Printf(func_call, "(define-method (%s %s . args) (apply %s %s args))", ! closname, method_signature, funcname, func_args); } else { ! Printf(func_call, "(define-method (%s %s) (%s %s))", ! closname, method_signature, funcname, func_args); } Delete(method_signature); Delete(func_args); ! return func_call; } *************** *** 1432,1440 **** Iterator f; List *prev = 0; - int has_empty_call = 0; int all_primitive = 1; /* first check for duplicates and an empty call */ - String *method_name = NewString(clos_name); String *newlist = NewList(); for (f = First(flist); f.item; f = Next(f)) { --- 1420,1426 ---- *************** *** 1442,1450 **** if (prev && compareTypeLists(f.item, prev) == 0) { Delete(f.item); - } else if (Len(f.item) == 0) { - has_empty_call = 1; - Delete(method_name); - method_name = NewStringf("%s@SWIG@multireal", clos_name); - Delete(f.item); } else { Append(newlist, f.item); --- 1428,1431 ---- *************** *** 1452,1456 **** Iterator j; for (j = First(f.item); j.item; j = Next(j)) { ! if (Strcmp(j.item, "^^##optional$$") != 0 && Strcmp(j.item, "^^##primitive$$") != 0) all_primitive = 0; } --- 1433,1437 ---- Iterator j; for (j = First(f.item); j.item; j = Next(j)) { ! if (Strcmp(j.item, "^^##optional$$") != 0 && Strcmp(j.item, "<top>") != 0) all_primitive = 0; } *************** *** 1461,1483 **** if (all_primitive) { ! Printf(clos_methods, "(define %s %s)\n", method_name, chickenPrimitiveName(scmname)); } else { for (f = First(flist); f.item; f = Next(f)) { /* now export clos code for argument */ ! String *fmt = NewStringf("(define-method (%s %%s) %%s)\n", method_name); ! String *func_call = buildClosFunctionCall(f.item, Char(fmt), chickenPrimitiveName(scmname), 1); ! Printf(clos_methods, "%s", func_call); Delete(f.item); Delete(func_call); } - - if (has_empty_call) { - Printf(clos_methods, "(declare (hide %s))\n", method_name); - Printf(clos_methods, "(define (%s . args) (if (null? args) (%s) (apply %s@SWIG@multireal args)))\n", - clos_name, chickenPrimitiveName(scmname), clos_name); - } } - Delete(method_name); Delete(clos_name); Delete(flist); --- 1442,1456 ---- if (all_primitive) { ! Printf(clos_methods, "(define %s %s)\n", clos_name, chickenPrimitiveName(scmname)); } else { for (f = First(flist); f.item; f = Next(f)) { /* now export clos code for argument */ ! String *func_call = buildClosFunctionCall(f.item, clos_name, chickenPrimitiveName(scmname)); ! Printf(clos_methods, "%s\n", func_call); Delete(f.item); Delete(func_call); } } Delete(clos_name); Delete(flist); |