| 1 | Index: Source/Modules/python.cxx |
| 2 | =================================================================== |
| 3 | RCS file: /cvsroot/SWIG/Source/Modules/python.cxx,v |
| 4 | retrieving revision 1.25 |
| 5 | diff -u -r1.25 python.cxx |
| 6 | --- Source/Modules/python.cxx 23 Sep 2003 21:26:04 -0000 1.25 |
| 7 | +++ Source/Modules/python.cxx 30 Oct 2003 02:39:33 -0000 |
| 8 | @@ -292,6 +292,9 @@ |
| 9 | static String *shadow_indent = 0; |
| 10 | static int in_class = 0; |
| 11 | static int classic = 0; |
| 12 | +static int modern = 0; |
| 13 | +static int apply = 0; |
| 14 | +static int new_repr = 0; |
| 15 | |
| 16 | /* C++ Support + Shadow Classes */ |
| 17 | |
| 18 | @@ -306,6 +309,9 @@ |
| 19 | -interface <lib>- Set the lib name to <lib>\n\ |
| 20 | -keyword - Use keyword arguments\n\ |
| 21 | -classic - Use classic classes only\n\ |
| 22 | + -modern - Use modern python features only, without compatibility code\n\ |
| 23 | + -apply - Use apply() in proxy classes\n\ |
| 24 | + -new_repr - Use more informative version of __repr__ in proxy classes\n\ |
| 25 | -noexcept - No automatic exception handling\n\ |
| 26 | -noproxy - Don't generate proxy classes \n\n"; |
| 27 | |
| 28 | @@ -344,6 +350,12 @@ |
| 29 | } else if ((strcmp(argv[i],"-shadow") == 0) || ((strcmp(argv[i],"-proxy") == 0))) { |
| 30 | shadow = 1; |
| 31 | Swig_mark_arg(i); |
| 32 | + } else if (strcmp(argv[i],"-apply") == 0) { |
| 33 | + apply = 1; |
| 34 | + Swig_mark_arg(i); |
| 35 | + } else if (strcmp(argv[i],"-new_repr") == 0) { |
| 36 | + new_repr = 1; |
| 37 | + Swig_mark_arg(i); |
| 38 | } else if ((strcmp(argv[i],"-noproxy") == 0)) { |
| 39 | shadow = 0; |
| 40 | Swig_mark_arg(i); |
| 41 | @@ -353,6 +365,10 @@ |
| 42 | } else if (strcmp(argv[i],"-classic") == 0) { |
| 43 | classic = 1; |
| 44 | Swig_mark_arg(i); |
| 45 | + } else if (strcmp(argv[i],"-modern") == 0) { |
| 46 | + classic = 0; |
| 47 | + modern = 1; |
| 48 | + Swig_mark_arg(i); |
| 49 | } else if (strcmp(argv[i],"-help") == 0) { |
| 50 | fputs(usage,stderr); |
| 51 | } else if (strcmp (argv[i], "-ldflags") == 0) { |
| 52 | @@ -480,47 +496,54 @@ |
| 53 | Printv(f_shadow, |
| 54 | "# This file was created automatically by SWIG.\n", |
| 55 | "# Don't modify this file, modify the SWIG interface instead.\n", |
| 56 | - "# This file is compatible with both classic and new-style classes.\n", |
| 57 | NIL); |
| 58 | |
| 59 | - Printf(f_shadow,"import %s\n", module); |
| 60 | - |
| 61 | - // Python-2.2 object hack |
| 62 | - |
| 63 | - Printv(f_shadow, |
| 64 | - "def _swig_setattr(self,class_type,name,value):\n", |
| 65 | - tab4, "if (name == \"this\"):\n", |
| 66 | - tab4, tab4, "if isinstance(value, class_type):\n", |
| 67 | - tab4, tab8, "self.__dict__[name] = value.this\n", |
| 68 | - tab4, tab8, "if hasattr(value,\"thisown\"): self.__dict__[\"thisown\"] = value.thisown\n", |
| 69 | - tab4, tab8, "del value.thisown\n", |
| 70 | - tab4, tab8, "return\n", |
| 71 | - // tab8, "if (name == \"this\") or (name == \"thisown\"): self.__dict__[name] = value; return\n", |
| 72 | - tab4, "method = class_type.__swig_setmethods__.get(name,None)\n", |
| 73 | - tab4, "if method: return method(self,value)\n", |
| 74 | - tab4, "self.__dict__[name] = value\n\n", |
| 75 | - NIL); |
| 76 | + if (! modern) { |
| 77 | + Printv(f_shadow, |
| 78 | + "# This file is compatible with both classic and new-style classes.\n", |
| 79 | + NIL); |
| 80 | + } |
| 81 | + |
| 82 | + Printf(f_shadow,"\nimport %s\n\n", module); |
| 83 | |
| 84 | - Printv(f_shadow, |
| 85 | - "def _swig_getattr(self,class_type,name):\n", |
| 86 | - tab4, "method = class_type.__swig_getmethods__.get(name,None)\n", |
| 87 | - tab4, "if method: return method(self)\n", |
| 88 | - tab4, "raise AttributeError,name\n\n", |
| 89 | - NIL); |
| 90 | + if (! modern) { |
| 91 | + // Python-2.2 object hack |
| 92 | + Printv(f_shadow, |
| 93 | + "def _swig_setattr(self,class_type,name,value):\n", |
| 94 | + tab4, "if (name == \"this\"):\n", |
| 95 | + tab4, tab4, "if isinstance(value, class_type):\n", |
| 96 | + tab4, tab8, "self.__dict__[name] = value.this\n", |
| 97 | + tab4, tab8, "if hasattr(value,\"thisown\"): self.__dict__[\"thisown\"] = value.thisown\n", |
| 98 | + tab4, tab8, "del value.thisown\n", |
| 99 | + tab4, tab8, "return\n", |
| 100 | + // tab8, "if (name == \"this\") or (name == \"thisown\"): self.__dict__[name] = value; return\n", |
| 101 | + tab4, "method = class_type.__swig_setmethods__.get(name,None)\n", |
| 102 | + tab4, "if method: return method(self,value)\n", |
| 103 | + tab4, "self.__dict__[name] = value\n\n", |
| 104 | + NIL); |
| 105 | |
| 106 | - if (!classic) { |
| 107 | - Printv(f_shadow, |
| 108 | - "import types\n", |
| 109 | - "try:\n", |
| 110 | - " _object = types.ObjectType\n", |
| 111 | - " _newclass = 1\n", |
| 112 | - "except AttributeError:\n", |
| 113 | - " class _object : pass\n", |
| 114 | - " _newclass = 0\n", |
| 115 | - "\n\n", |
| 116 | - NIL); |
| 117 | + Printv(f_shadow, |
| 118 | + "def _swig_getattr(self,class_type,name):\n", |
| 119 | + tab4, "method = class_type.__swig_getmethods__.get(name,None)\n", |
| 120 | + tab4, "if method: return method(self)\n", |
| 121 | + tab4, "raise AttributeError,name\n\n", |
| 122 | + NIL); |
| 123 | + |
| 124 | + if (!classic) { |
| 125 | + Printv(f_shadow, |
| 126 | + "import types\n", |
| 127 | + "try:\n", |
| 128 | + " _object = types.ObjectType\n", |
| 129 | + " _newclass = 1\n", |
| 130 | + "except AttributeError:\n", |
| 131 | + " class _object : pass\n", |
| 132 | + " _newclass = 0\n", |
| 133 | + "del types\n", |
| 134 | + "\n\n", |
| 135 | + NIL); |
| 136 | + } |
| 137 | } |
| 138 | - |
| 139 | + |
| 140 | if (directorsEnabled()) { |
| 141 | // Try loading weakref.proxy, which is only available in Python 2.1 and higher |
| 142 | Printv(f_shadow, |
| 143 | @@ -610,6 +633,83 @@ |
| 144 | return Language::importDirective(n); |
| 145 | } |
| 146 | |
| 147 | + |
| 148 | + /* ------------------------------------------------------------ |
| 149 | + * emitFuncCallHelper() |
| 150 | + * Write the shadow code to call a function in the extension |
| 151 | + * module. Takes into account the -apply flag and whether |
| 152 | + * to use keyword args or not. |
| 153 | + * ------------------------------------------------------------ */ |
| 154 | + |
| 155 | + String *funcCallHelper(String *name, int kw) { |
| 156 | + String *str; |
| 157 | + |
| 158 | + str = NewString(""); |
| 159 | + if (apply) { |
| 160 | + Printv(str, "apply(", module, ".", name, ", args", (kw ? ", kwargs" : ""), ")", NIL); |
| 161 | + } else { |
| 162 | + Printv(str, module, ".", name, "(*args", (kw ? ", **kwargs" : ""), ")", NIL); |
| 163 | + } |
| 164 | + return str; |
| 165 | + } |
| 166 | + |
| 167 | + |
| 168 | + /* ------------------------------------------------------------ |
| 169 | + * emitFunctionShadowHelper() |
| 170 | + * Refactoring some common code out of functionWrapper and |
| 171 | + * dispatchFunction that writes the proxy code for non-member |
| 172 | + * functions. |
| 173 | + * ------------------------------------------------------------ */ |
| 174 | + |
| 175 | + void emitFunctionShadowHelper(Node *n, File *f_dest, String *name, int kw) { |
| 176 | + if ( ! have_addtofunc(n) ) { |
| 177 | + /* If there is no addtofunc directive then just assign from the extension module */ |
| 178 | + Printv(f_dest, "\n", name, " = ", module, ".", name, "\n", NIL); |
| 179 | + } else { |
| 180 | + /* Otherwise make a wrapper function to insert the code into */ |
| 181 | + Printv(f_dest, "\ndef ", name, "(*args", (kw ? ", **kwargs" : ""), "):\n", NIL); |
| 182 | + Printv(f_dest, tab4, "val = ", funcCallHelper(name, kw), "\n", NIL); |
| 183 | + Printv(f_dest, tab4, addtofunc(n), "\n", NIL); |
| 184 | + Printv(f_dest, tab4, "return val\n", NIL); |
| 185 | + } |
| 186 | + } |
| 187 | + |
| 188 | + |
| 189 | + /* ------------------------------------------------------------ |
| 190 | + * check_kwargs() |
| 191 | + * check if using kwargs is allowed for this Node |
| 192 | + * ------------------------------------------------------------ */ |
| 193 | + |
| 194 | + int check_kwargs(Node *n) { |
| 195 | + return ((use_kw || Getattr(n,"feature:kwargs")) && !Getattr(n, "feature:nokwargs")) ? 1 : 0; |
| 196 | + } |
| 197 | + |
| 198 | + |
| 199 | + /* ------------------------------------------------------------ |
| 200 | + * have_addtofunc() |
| 201 | + * Check if there is a %addtofunc directive and it has text |
| 202 | + * ------------------------------------------------------------ */ |
| 203 | + |
| 204 | + bool have_addtofunc(Node *n) { |
| 205 | + String* str = Getattr(n, "feature:addtofunc"); |
| 206 | + return (str != NULL && Len(str) > 0); |
| 207 | + } |
| 208 | + |
| 209 | + /* ------------------------------------------------------------ |
| 210 | + * addtofunc() |
| 211 | + * Get the %addtofunc code, stripping off {} if neccessary |
| 212 | + * ------------------------------------------------------------ */ |
| 213 | + |
| 214 | + String *addtofunc(Node *n) { |
| 215 | + String* str = Getattr(n, "feature:addtofunc"); |
| 216 | + char* t = Char(str); |
| 217 | + if (*t == '{') { |
| 218 | + Delitem(str ,0); |
| 219 | + Delitem(str,DOH_END); |
| 220 | + } |
| 221 | + return str; |
| 222 | + } |
| 223 | + |
| 224 | /* ------------------------------------------------------------ |
| 225 | * add_method() |
| 226 | * ------------------------------------------------------------ */ |
| 227 | @@ -650,7 +750,7 @@ |
| 228 | int num_required; |
| 229 | int num_arguments; |
| 230 | int varargs = 0; |
| 231 | - int allow_kwargs = (use_kw || Getattr(n,"feature:kwargs")) ? 1 : 0; |
| 232 | + int allow_kwargs = check_kwargs(n); |
| 233 | |
| 234 | /* member of a director class? */ |
| 235 | String *nodeType = Getattr(n, "nodeType"); |
| 236 | @@ -1007,11 +1107,7 @@ |
| 237 | |
| 238 | /* Create a shadow for this function (if enabled and not in a member function) */ |
| 239 | if ((shadow) && (!(shadow & PYSHADOW_MEMBER))) { |
| 240 | - if (in_class) { |
| 241 | - Printv(f_shadow_stubs,iname, " = ", module, ".", iname, "\n\n", NIL); |
| 242 | - } else { |
| 243 | - Printv(f_shadow,iname, " = ", module, ".", iname, "\n\n", NIL); |
| 244 | - } |
| 245 | + emitFunctionShadowHelper(n, in_class ? f_shadow_stubs : f_shadow, iname, allow_kwargs); |
| 246 | } |
| 247 | } else { |
| 248 | if (!Getattr(n,"sym:nextSibling")) { |
| 249 | @@ -1068,7 +1164,7 @@ |
| 250 | |
| 251 | /* Create a shadow for this function (if enabled and not in a member function) */ |
| 252 | if ((shadow) && (!(shadow & PYSHADOW_MEMBER))) { |
| 253 | - Printv(f_shadow_stubs,symname, " = ", module, ".", symname, "\n\n", NIL); |
| 254 | + emitFunctionShadowHelper(n, f_shadow_stubs, symname, 0); |
| 255 | } |
| 256 | DelWrapper(f); |
| 257 | Delete(dispatch); |
| 258 | @@ -1754,6 +1850,7 @@ |
| 259 | |
| 260 | virtual int classHandler(Node *n) { |
| 261 | int oldclassic = classic; |
| 262 | + int oldmodern = modern; |
| 263 | |
| 264 | if (shadow) { |
| 265 | |
| 266 | @@ -1763,8 +1860,16 @@ |
| 267 | |
| 268 | if (Getattr(n,"cplus:exceptionclass")) { |
| 269 | classic = 1; |
| 270 | + modern = 0; |
| 271 | + } |
| 272 | + if (Getattr(n,"feature:classic")) { |
| 273 | + classic = 1; |
| 274 | + modern = 0; |
| 275 | + } |
| 276 | + if (Getattr(n,"feature:modern")) { |
| 277 | + classic = 0; |
| 278 | + modern = 1; |
| 279 | } |
| 280 | - if (Getattr(n,"feature:classic")) classic = 1; |
| 281 | |
| 282 | shadow_indent = (String *) tab4; |
| 283 | |
| 284 | @@ -1798,30 +1903,32 @@ |
| 285 | Printf(f_shadow,"(%s)", base_class); |
| 286 | } else { |
| 287 | if (!classic) { |
| 288 | - Printf(f_shadow,"(_object)"); |
| 289 | + Printf(f_shadow, modern ? "(object)" : "(_object)"); |
| 290 | } |
| 291 | } |
| 292 | Printf(f_shadow,":\n"); |
| 293 | |
| 294 | - Printv(f_shadow,tab4,"__swig_setmethods__ = {}\n",NIL); |
| 295 | - if (Len(base_class)) { |
| 296 | - Printf(f_shadow,"%sfor _s in [%s]: __swig_setmethods__.update(_s.__swig_setmethods__)\n",tab4,base_class); |
| 297 | - } |
| 298 | + if (!modern) { |
| 299 | + Printv(f_shadow,tab4,"__swig_setmethods__ = {}\n",NIL); |
| 300 | + if (Len(base_class)) { |
| 301 | + Printf(f_shadow,"%sfor _s in [%s]: __swig_setmethods__.update(_s.__swig_setmethods__)\n",tab4,base_class); |
| 302 | + } |
| 303 | |
| 304 | - Printv(f_shadow, |
| 305 | - tab4, "__setattr__ = lambda self, name, value: _swig_setattr(self, ", class_name, ", name, value)\n", |
| 306 | - NIL); |
| 307 | + Printv(f_shadow, |
| 308 | + tab4, "__setattr__ = lambda self, name, value: _swig_setattr(self, ", class_name, ", name, value)\n", |
| 309 | + NIL); |
| 310 | |
| 311 | - Printv(f_shadow,tab4,"__swig_getmethods__ = {}\n",NIL); |
| 312 | - if (Len(base_class)) { |
| 313 | - Printf(f_shadow,"%sfor _s in [%s]: __swig_getmethods__.update(_s.__swig_getmethods__)\n",tab4,base_class); |
| 314 | - } |
| 315 | + Printv(f_shadow,tab4,"__swig_getmethods__ = {}\n",NIL); |
| 316 | + if (Len(base_class)) { |
| 317 | + Printf(f_shadow,"%sfor _s in [%s]: __swig_getmethods__.update(_s.__swig_getmethods__)\n",tab4,base_class); |
| 318 | + } |
| 319 | |
| 320 | - Printv(f_shadow, |
| 321 | - tab4, "__getattr__ = lambda self, name: _swig_getattr(self, ", class_name, ", name)\n", |
| 322 | - NIL); |
| 323 | + Printv(f_shadow, |
| 324 | + tab4, "__getattr__ = lambda self, name: _swig_getattr(self, ", class_name, ", name)\n", |
| 325 | + NIL); |
| 326 | + } |
| 327 | } |
| 328 | - |
| 329 | + |
| 330 | /* Emit all of the members */ |
| 331 | |
| 332 | in_class = 1; |
| 333 | @@ -1853,21 +1960,37 @@ |
| 334 | |
| 335 | if (!have_repr) { |
| 336 | /* Supply a repr method for this class */ |
| 337 | - Printv(f_shadow, |
| 338 | - tab4, "def __repr__(self):\n", |
| 339 | - tab8, "return \"<C ", class_name," instance at %s>\" % (self.this,)\n", |
| 340 | - NIL); |
| 341 | + if (new_repr) { |
| 342 | + Printv(f_shadow, |
| 343 | + tab4, "def __repr__(self):\n", |
| 344 | + tab8, "return \"<%s.%s; proxy of ", CPlusPlus ? "C++ " : "C ", real_classname," instance at %s>\" % (self.__class__.__module__, self.__class__.__name__, self.this,)\n", |
| 345 | + NIL); |
| 346 | + } |
| 347 | + else { |
| 348 | + Printv(f_shadow, |
| 349 | + tab4, "def __repr__(self):\n", |
| 350 | + tab8, "return \"<C ", real_classname," instance at %s>\" % (self.this,)\n", |
| 351 | + NIL); |
| 352 | + } |
| 353 | } |
| 354 | - /* Now build the real class with a normal constructor */ |
| 355 | + /* Now the Ptr class */ |
| 356 | Printv(f_shadow, |
| 357 | "\nclass ", class_name, "Ptr(", class_name, "):\n", |
| 358 | - tab4, "def __init__(self,this):\n", |
| 359 | - tab8, "_swig_setattr(self, ", class_name, ", 'this', this)\n", |
| 360 | - tab8, "if not hasattr(self,\"thisown\"): _swig_setattr(self, ", class_name, ", 'thisown', 0)\n", |
| 361 | + tab4, "def __init__(self, this):\n", NIL); |
| 362 | + if (!modern) { |
| 363 | + Printv(f_shadow, |
| 364 | + tab8, "_swig_setattr(self, ", class_name, ", 'this', this)\n", |
| 365 | + tab8, "if not hasattr(self,\"thisown\"): _swig_setattr(self, ", class_name, ", 'thisown', 0)\n", |
| 366 | + tab8, "_swig_setattr(self, ", class_name, ",self.__class__,", class_name, ")\n", |
| 367 | + NIL); |
| 368 | + } else { |
| 369 | + Printv(f_shadow, |
| 370 | + tab8, "self.this = this\n", |
| 371 | + tab8, "if not hasattr(self,\"thisown\"): self.thisown = 0\n", |
| 372 | + tab8, "self.__class__ = ", class_name, "\n", NIL); |
| 373 | // tab8,"try: self.this = this.this; self.thisown = getattr(this,'thisown',0); this.thisown=0\n", |
| 374 | // tab8,"except AttributeError: self.this = this\n" |
| 375 | - tab8, "_swig_setattr(self, ", class_name, ",self.__class__,", class_name, ")\n", |
| 376 | - NIL); |
| 377 | + } |
| 378 | |
| 379 | Printf(f_shadow,"%s.%s_swigregister(%sPtr)\n", module, class_name, class_name,0); |
| 380 | shadow_indent = 0; |
| 381 | @@ -1875,6 +1998,7 @@ |
| 382 | Clear(f_shadow_stubs); |
| 383 | } |
| 384 | classic = oldclassic; |
| 385 | + modern = oldmodern; |
| 386 | return SWIG_OK; |
| 387 | } |
| 388 | |
| 389 | @@ -1894,7 +2018,7 @@ |
| 390 | |
| 391 | if (!Getattr(n,"sym:nextSibling")) { |
| 392 | if (shadow) { |
| 393 | - int allow_kwargs = (use_kw || Getattr(n,"feature:kwargs")) ? 1 : 0; |
| 394 | + int allow_kwargs = (check_kwargs(n) && !Getattr(n,"sym:overloaded")) ? 1 : 0; |
| 395 | if (Strcmp(symname,"__repr__") == 0) |
| 396 | have_repr = 1; |
| 397 | |
| 398 | @@ -1902,14 +2026,18 @@ |
| 399 | String *pycode = pythoncode(Getattr(n,"feature:shadow"),tab4); |
| 400 | Printv(f_shadow,pycode,"\n",NIL); |
| 401 | } else { |
| 402 | - if (allow_kwargs && !Getattr(n,"sym:overloaded")) { |
| 403 | - Printv(f_shadow,tab4, "def ", symname, "(*args, **kwargs): ", NIL); |
| 404 | - Printv(f_shadow, "return apply(", module, ".", Swig_name_member(class_name,symname), ",args, kwargs)\n", NIL); |
| 405 | - } else { |
| 406 | - Printv(f_shadow, tab4, "def ", symname, "(*args): ", NIL); |
| 407 | - Printv(f_shadow, "return apply(", module, ".", Swig_name_member(class_name,symname), ",args)\n",NIL); |
| 408 | - } |
| 409 | - } |
| 410 | + |
| 411 | + Printv(f_shadow, tab4, "def ", symname, "(*args", (allow_kwargs ? ", **kwargs" : ""), "): ", NIL); |
| 412 | + if ( have_addtofunc(n) ) { |
| 413 | + Printv(f_shadow, "\n", NIL); |
| 414 | + Printv(f_shadow, tab8, "val = ", funcCallHelper(Swig_name_member(class_name,symname), allow_kwargs), "\n", NIL); |
| 415 | + Printv(f_shadow, tab8, addtofunc(n), "\n", NIL); |
| 416 | + Printv(f_shadow, tab8, "return val\n", NIL); |
| 417 | + } else { |
| 418 | + Printv(f_shadow, "return ", funcCallHelper(Swig_name_member(class_name,symname), allow_kwargs), "\n", NIL); |
| 419 | + } |
| 420 | + } |
| 421 | + |
| 422 | } |
| 423 | } |
| 424 | return SWIG_OK; |
| 425 | @@ -1923,10 +2051,28 @@ |
| 426 | String *symname = Getattr(n,"sym:name"); |
| 427 | Language::staticmemberfunctionHandler(n); |
| 428 | if (shadow) { |
| 429 | - Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = lambda x: ", module, ".", Swig_name_member(class_name, symname), "\n", NIL); |
| 430 | - if (!classic) { |
| 431 | - Printv(f_shadow, tab4, "if _newclass:", symname, " = staticmethod(", module, ".", |
| 432 | - Swig_name_member(class_name, symname), ")\n", NIL); |
| 433 | + if ( !classic && have_addtofunc(n) ) { |
| 434 | + int kw = (check_kwargs(n) && !Getattr(n,"sym:overloaded")) ? 1 : 0; |
| 435 | + Printv(f_shadow, tab4, "def ", symname, "(*args", (kw ? ", **kwargs" : ""), "):\n", NIL); |
| 436 | + Printv(f_shadow, tab8, "val = ", funcCallHelper(Swig_name_member(class_name, symname), kw), "\n", NIL); |
| 437 | + Printv(f_shadow, tab8, addtofunc(n), "\n", NIL); |
| 438 | + Printv(f_shadow, tab8, "return val\n", NIL); |
| 439 | + Printv(f_shadow, tab4, modern ? "" : "if _newclass:", symname, |
| 440 | + " = staticmethod(", symname, ")\n", NIL); |
| 441 | + |
| 442 | + if (!modern) { |
| 443 | + Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = lambda x: ", symname, "\n", NIL); |
| 444 | + } |
| 445 | + |
| 446 | + } else { |
| 447 | + if (!modern) { |
| 448 | + Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = lambda x: ", module, ".", Swig_name_member(class_name, symname), "\n", NIL); |
| 449 | + } |
| 450 | + if (!classic) { |
| 451 | + Printv(f_shadow, tab4, modern ? "" : "if _newclass:", symname, |
| 452 | + " = staticmethod(", module, ".", |
| 453 | + Swig_name_member(class_name, symname), ")\n", NIL); |
| 454 | + } |
| 455 | } |
| 456 | } |
| 457 | return SWIG_OK; |
| 458 | @@ -1972,7 +2118,7 @@ |
| 459 | |
| 460 | if (!Getattr(n,"sym:nextSibling")) { |
| 461 | if (shadow) { |
| 462 | - int allow_kwargs = (use_kw || Getattr(n,"feature:kwargs")) ? 1 : 0; |
| 463 | + int allow_kwargs = (check_kwargs(n) && (!Getattr(n,"sym:overloaded"))) ? 1 : 0; |
| 464 | if (!have_constructor) { |
| 465 | if (Getattr(n,"feature:shadow")) { |
| 466 | String *pycode = pythoncode(Getattr(n,"feature:shadow"),tab4); |
| 467 | @@ -1991,18 +2137,25 @@ |
| 468 | tab8, tab4, "args = (self,) + args\n", |
| 469 | NIL); |
| 470 | } |
| 471 | - if ((allow_kwargs) && (!Getattr(n,"sym:overloaded"))) { |
| 472 | - Printv(f_shadow, tab4, "def __init__(self,*args,**kwargs):\n", NIL); |
| 473 | - Printv(f_shadow, pass_self, NIL); |
| 474 | - Printv(f_shadow, tab8, "_swig_setattr(self, ", rclassname, ", 'this', apply(", module, ".", Swig_name_construct(symname), ",args, kwargs))\n", NIL); |
| 475 | - } else { |
| 476 | - Printv(f_shadow, tab4, "def __init__(self,*args):\n",NIL); |
| 477 | - Printv(f_shadow, pass_self, NIL); |
| 478 | - Printv(f_shadow, tab8, "_swig_setattr(self, ", rclassname, ", 'this', apply(", module, ".", Swig_name_construct(symname), ",args))\n", NIL); |
| 479 | - } |
| 480 | - Printv(f_shadow, |
| 481 | - tab8, "_swig_setattr(self, ", rclassname, ", 'thisown', 1)\n", |
| 482 | - NIL); |
| 483 | + |
| 484 | + Printv(f_shadow, tab4, "def __init__(self, *args", |
| 485 | + (allow_kwargs ? ", **kwargs" : ""), "):\n", NIL); |
| 486 | + Printv(f_shadow, pass_self, NIL); |
| 487 | + if (!modern) { |
| 488 | + Printv(f_shadow, tab8, "_swig_setattr(self, ", rclassname, ", 'this', ", |
| 489 | + funcCallHelper(Swig_name_construct(symname), allow_kwargs), ")\n", NIL); |
| 490 | + Printv(f_shadow, |
| 491 | + tab8, "_swig_setattr(self, ", rclassname, ", 'thisown', 1)\n", |
| 492 | + NIL); |
| 493 | + } else { |
| 494 | + Printv(f_shadow, tab8, "newobj = ", |
| 495 | + funcCallHelper(Swig_name_construct(symname), allow_kwargs), "\n", NIL); |
| 496 | + Printv(f_shadow, tab8, "self.this = newobj.this\n", NIL); |
| 497 | + Printv(f_shadow, tab8, "self.thisown = 1\n", NIL); |
| 498 | + Printv(f_shadow, tab8, "del newobj.thisown\n", NIL); |
| 499 | + } |
| 500 | + if ( have_addtofunc(n) ) |
| 501 | + Printv(f_shadow, tab8, addtofunc(n), "\n", NIL); |
| 502 | Delete(pass_self); |
| 503 | } |
| 504 | have_constructor = 1; |
| 505 | @@ -2014,19 +2167,16 @@ |
| 506 | String *pycode = pythoncode(Getattr(n,"feature:shadow"),""); |
| 507 | Printv(f_shadow_stubs,pycode,"\n",NIL); |
| 508 | } else { |
| 509 | - if ((allow_kwargs) && (!Getattr(n,"sym:overloaded"))) |
| 510 | - Printv(f_shadow_stubs, "def ", symname, "(*args,**kwargs):\n", NIL); |
| 511 | - else |
| 512 | - Printv(f_shadow_stubs, "def ", symname, "(*args):\n", NIL); |
| 513 | - |
| 514 | - Printv(f_shadow_stubs, tab4, "val = apply(", NIL); |
| 515 | - if ((allow_kwargs) && (!Getattr(n,"sym:overloaded"))) |
| 516 | - Printv(f_shadow_stubs, module, ".", Swig_name_construct(symname), ",args,kwargs)\n", NIL); |
| 517 | - else |
| 518 | - Printv(f_shadow_stubs, module, ".", Swig_name_construct(symname), ",args)\n", NIL); |
| 519 | - Printv(f_shadow_stubs,tab4, "val.thisown = 1\n", |
| 520 | - tab4, "return val\n\n", NIL); |
| 521 | - } |
| 522 | + |
| 523 | + Printv(f_shadow_stubs, "\ndef ", symname, "(*args", |
| 524 | + (allow_kwargs ? ", **kwargs" : ""), "):\n", NIL); |
| 525 | + Printv(f_shadow_stubs, tab4, "val = ", |
| 526 | + funcCallHelper(Swig_name_construct(symname), allow_kwargs), "\n", NIL); |
| 527 | + Printv(f_shadow_stubs, tab4, "val.thisown = 1\n", NIL); |
| 528 | + if ( have_addtofunc(n) ) |
| 529 | + Printv(f_shadow_stubs, tab4, addtofunc(n), "\n", NIL); |
| 530 | + Printv(f_shadow_stubs, tab4, "return val\n", NIL); |
| 531 | + } |
| 532 | } |
| 533 | } |
| 534 | } |
| 535 | @@ -2045,7 +2195,9 @@ |
| 536 | Language::destructorHandler(n); |
| 537 | shadow = oldshadow; |
| 538 | if (shadow) { |
| 539 | - Printv(f_shadow, tab4, "def __del__(self, destroy= ", module, ".", Swig_name_destroy(symname), "):\n", NIL); |
| 540 | + Printv(f_shadow, tab4, "def __del__(self, destroy=", module, ".", Swig_name_destroy(symname), "):\n", NIL); |
| 541 | + if ( have_addtofunc(n) ) |
| 542 | + Printv(f_shadow, tab8, addtofunc(n), "\n", NIL); |
| 543 | Printv(f_shadow, tab8, "try:\n", NIL); |
| 544 | Printv(f_shadow, tab4, tab8, "if self.thisown: destroy(self)\n", NIL); |
| 545 | Printv(f_shadow, tab8, "except: pass\n", NIL); |
| 546 | @@ -2066,21 +2218,22 @@ |
| 547 | shadow = oldshadow; |
| 548 | |
| 549 | if (shadow) { |
| 550 | - int immutable = 0; |
| 551 | - if (!Getattr(n,"feature:immutable")) { |
| 552 | - Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", Swig_name_set(Swig_name_member(class_name,symname)), "\n", NIL); |
| 553 | - } else { |
| 554 | - immutable = 1; |
| 555 | + int immutable = (Getattr(n,"feature:immutable") != NULL); |
| 556 | + if (!modern) { |
| 557 | + if (!immutable) { |
| 558 | + Printv(f_shadow, tab4, "__swig_setmethods__[\"", symname, "\"] = ", module, ".", Swig_name_set(Swig_name_member(class_name,symname)), "\n", NIL); |
| 559 | + } |
| 560 | + Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", Swig_name_get(Swig_name_member(class_name,symname)),"\n", NIL); |
| 561 | } |
| 562 | - Printv(f_shadow, tab4, "__swig_getmethods__[\"", symname, "\"] = ", module, ".", Swig_name_get(Swig_name_member(class_name,symname)),"\n", NIL); |
| 563 | - |
| 564 | if (!classic) { |
| 565 | if (immutable) { |
| 566 | - Printv(f_shadow,tab4,"if _newclass:", symname," = property(", module, ".", |
| 567 | + Printv(f_shadow,tab4, modern ? "" : "if _newclass:", |
| 568 | + symname," = property(", module, ".", |
| 569 | Swig_name_get(Swig_name_member(class_name,symname)),")\n", NIL); |
| 570 | } else { |
| 571 | - Printv(f_shadow,tab4,"if _newclass:", symname," = property(", |
| 572 | - module, ".", Swig_name_get(Swig_name_member(class_name,symname)),",", |
| 573 | + Printv(f_shadow,tab4, modern ? "" : "if _newclass:", |
| 574 | + symname," = property(", |
| 575 | + module, ".", Swig_name_get(Swig_name_member(class_name,symname)),", ", |
| 576 | module, ".", Swig_name_set(Swig_name_member(class_name,symname)),")\n", NIL); |
| 577 | } |
| 578 | } |
| 579 | @@ -2142,8 +2295,9 @@ |
| 580 | Delitem(temp,0); |
| 581 | Delitem(temp,DOH_END); |
| 582 | } |
| 583 | + |
| 584 | /* Split the input text into lines */ |
| 585 | - List *clist = DohSplit(temp,'\n',-1); |
| 586 | + List *clist = DohSplitLines(temp); |
| 587 | Delete(temp); |
| 588 | int initial = 0; |
| 589 | String *s = 0; |
| 590 | @@ -2194,7 +2348,7 @@ |
| 591 | if ((!ImportMode) && ((Cmp(section,"python") == 0) || (Cmp(section,"shadow") == 0))) { |
| 592 | if (shadow) { |
| 593 | String *pycode = pythoncode(code,shadow_indent); |
| 594 | - Printv(f_shadow, pycode, "\n", NIL); |
| 595 | + Printv(f_shadow, pycode, NIL); |
| 596 | Delete(pycode); |
| 597 | } |
| 598 | } else { |