# HG changeset patch
# User Martin Albrecht <malb@informatik.uni-bremen.de>
# Date 1251243593 -3600
# Node ID 6be4b277e4974b602be3fab42dd1a6809f1b6ce0
# Parent a7bcb6ef478e5d63e665a7f86dc9e89f4549fac7
use weakrefs for cached polynomial rings where it is safe
diff -r a7bcb6ef478e -r 6be4b277e497 sage/rings/polynomial/polynomial_ring_constructor.py
a
|
b
|
|
355 | 355 | def _get_from_cache(key): |
356 | 356 | try: |
357 | 357 | if _cache.has_key(key): |
358 | | return _cache[key] #() |
| 358 | r = _cache[key] |
| 359 | if isinstance(r,weakref.ReferenceType): |
| 360 | return r() |
| 361 | else: |
| 362 | return r |
359 | 363 | except TypeError, msg: |
360 | | raise TypeError, 'key = %s\n%s'%(key,msg) |
| 364 | raise TypeError, 'key = %s\n%s'%(key,msg) |
361 | 365 | return None |
362 | 366 | |
363 | | def _save_in_cache(key, R): |
| 367 | def _save_in_cache(key, R, weak=False): |
364 | 368 | try: |
365 | | #_cache[key] = weakref.ref(R) |
366 | | _cache[key] = R |
| 369 | if weak: |
| 370 | _cache[key] = weakref.ref(R) |
| 371 | else: |
| 372 | _cache[key] = R |
367 | 373 | except TypeError, msg: |
368 | 374 | raise TypeError, 'key = %s\n%s'%(key,msg) |
369 | 375 | |
… |
… |
|
410 | 416 | if hasattr(R, '_implementation_names'): |
411 | 417 | for name in R._implementation_names: |
412 | 418 | real_key = key[0:3] + (name,) |
413 | | _save_in_cache(real_key, R) |
| 419 | _save_in_cache(real_key, R, weak=False) |
414 | 420 | else: |
415 | | _save_in_cache(key, R) |
| 421 | _save_in_cache(key, R, weak=False) |
416 | 422 | return R |
417 | 423 | |
418 | 424 | def _multi_variate(base_ring, names, n, sparse, order): |
… |
… |
|
429 | 435 | return R |
430 | 436 | |
431 | 437 | from sage.rings.polynomial.multi_polynomial_libsingular import MPolynomialRing_libsingular |
| 438 | |
432 | 439 | if m.integral_domain.is_IntegralDomain(base_ring): |
433 | 440 | if n < 1: |
434 | 441 | R = m.MPolynomialRing_polydict_domain(base_ring, n, names, order) |
… |
… |
|
443 | 450 | except ( TypeError, NotImplementedError ): |
444 | 451 | R = m.MPolynomialRing_polydict(base_ring, n, names, order) |
445 | 452 | |
446 | | _save_in_cache(key, R) |
| 453 | _save_in_cache(key, R, weak=True) |
447 | 454 | return R |
448 | 455 | |
449 | 456 | def BooleanPolynomialRing_constructor(n=None, names=None, order="lex"): |
… |
… |
|
520 | 527 | from sage.rings.polynomial.pbori import BooleanPolynomialRing |
521 | 528 | R = BooleanPolynomialRing(n, names, order) |
522 | 529 | |
523 | | _save_in_cache(key, R) |
| 530 | _save_in_cache(key, R, weak=True) |
524 | 531 | return R |
525 | 532 | |
526 | 533 | |