195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org# found in the LICENSE file.
501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org'''In GRIT, we used to compile a lot of regular expressions at parse
701fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgtime.  Since many of them never get used, we use lazy_re to compile
801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgthem on demand the first time they are used, thus speeding up startup
901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgtime in some cases.
1001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org'''
1101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
1201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgimport re
1301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
1401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
1501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgclass LazyRegexObject(object):
1601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  '''This object creates a RegexObject with the arguments passed in
1701fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  its constructor, the first time any attribute except the several on
1801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  the class itself is accessed.  This accomplishes lazy compilation of
1901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  the regular expression while maintaining a nearly-identical
2001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  interface.
2101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  '''
2201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
2301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  def __init__(self, *args, **kwargs):
2401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    self._stash_args = args
2501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    self._stash_kwargs = kwargs
2601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    self._lazy_re = None
2701fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
2801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  def _LazyInit(self):
2901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    if not self._lazy_re:
3001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      self._lazy_re = re.compile(*self._stash_args, **self._stash_kwargs)
3101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
3201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  def __getattribute__(self, name):
3301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    if name in ('_LazyInit', '_lazy_re', '_stash_args', '_stash_kwargs'):
3401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      return object.__getattribute__(self, name)
3501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org    else:
3601fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org      self._LazyInit()
37ffaab37ab059ae68d9459a353064752795381113joi@chromium.org      return getattr(self._lazy_re, name)
3801fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
3901fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org
4001fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.orgdef compile(*args, **kwargs):
4101fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  '''Creates a LazyRegexObject that, when invoked on, will compile a
4201fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  re.RegexObject (via re.compile) with the same arguments passed to
4301fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  this function, and delegate almost all of its methods to it.
4401fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  '''
4501fadb72b6e94e6511eaffd1874a8cc095f098a7joi@chromium.org  return LazyRegexObject(*args, **kwargs)
46