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