about summary refs log tree commit homepage
path: root/lib/PublicInbox/HlMod.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2019-02-02 07:35:06 +0000
committerEric Wong <e@80x24.org>2019-02-05 10:58:35 +0000
commit8eb2c4f7c0aed11810280c6dfa63f75fd961e3cd (patch)
tree8544eeb37994389de4bde873bb9d023d2cb465ba /lib/PublicInbox/HlMod.pm
parent58db2bbcbc9836fe36c91eff761e31edfd53f866 (diff)
downloadpublic-inbox-8eb2c4f7c0aed11810280c6dfa63f75fd961e3cd.tar.gz
It turns out there's no point in having multiple instances of
this or having to worry about destruction or destruction
ordering.

This will make it easier to reuse the one instance we have
across different modules.
Diffstat (limited to 'lib/PublicInbox/HlMod.pm')
-rw-r--r--lib/PublicInbox/HlMod.pm33
1 files changed, 13 insertions, 20 deletions
diff --git a/lib/PublicInbox/HlMod.pm b/lib/PublicInbox/HlMod.pm
index 284e4b18..13f27d19 100644
--- a/lib/PublicInbox/HlMod.pm
+++ b/lib/PublicInbox/HlMod.pm
@@ -16,6 +16,7 @@ package PublicInbox::HlMod;
 use strict;
 use warnings;
 use highlight; # SWIG-generated stuff
+my $hl;
 
 sub _parse_filetypes ($) {
         my $ft_conf = $_[0]->searchFile('filetypes.conf') or
@@ -52,16 +53,20 @@ sub _parse_filetypes ($) {
         (\%ext2lang, \@shebang);
 }
 
+# We only need one instance, so we don't need to do
+# highlight::CodeGenerator::deleteInstance
 sub new {
         my ($class) = @_;
-        my $dir = highlight::DataDir->new;
-        $dir->initSearchDirectories('');
-        my ($ext2lang, $shebang) = _parse_filetypes($dir);
-        bless {
-                -dir => $dir,
-                -ext2lang => $ext2lang,
-                -shebang => $shebang,
-        }, $class;
+        $hl ||= do {
+                my $dir = highlight::DataDir->new;
+                $dir->initSearchDirectories('');
+                my ($ext2lang, $shebang) = _parse_filetypes($dir);
+                bless {
+                        -dir => $dir,
+                        -ext2lang => $ext2lang,
+                        -shebang => $shebang,
+                }, $class;
+        };
 }
 
 sub _shebang2lang ($$) {
@@ -120,16 +125,4 @@ sub do_hl_lang {
         \$out;
 }
 
-# SWIG instances aren't reference-counted, but $self is;
-# so we need to delete all the CodeGenerator instances manually
-# at our own destruction
-sub DESTROY {
-        my ($self) = @_;
-        foreach my $gen (values %$self) {
-                if (ref($gen) eq 'highlight::CodeGenerator') {
-                        highlight::CodeGenerator::deleteInstance($gen);
-                }
-        }
-}
-
 1;