Hi Sam,

Since you mentioned that you are hoping to do a release sooner or
later, could you consider the following two changes:

- bug file for included line numbers

Change this code (starting on line: 2318):

    # count newlines in chunk and advance line count
    $fcounter += scalar(@{[$chunk =~ m/(\n)/g]});
    # if we just crossed the end of an included file
    # pop off the record and re-alias to the enclosing file's info
    pop(@fstack), (*fname, *fcounter, *fmax) = \ (
@{$fstack[$#fstack]} )
      if ($fcounter > $fmax);

With this code:

    # count newlines in chunk and advance line count
    $fcounter += scalar(@{[$chunk =~ m/(\n)/g]});
    # if we just crossed the end of an included file
    # pop off the record and re-alias to the enclosing file's info
    while ($fcounter > $fmax) {
      my $counter_offset = $fcounter - $fmax;
      pop(@fstack), (*fname, *fcounter, *fmax) = \ (
@{$fstack[$#fstack]} );
      $fcounter += $counter_offset;
    }


This correctly rolls back the number of fstack entries so that line
number errors are correct for the given template.




- performance enhancement during output() phase

Change this code (starting line: 2622):

  # support the associate magic, searching for undefined params and
  # attempting to fill them from the associated objects.
  if (scalar(@{$options->{associate}})) {
    # prepare case-mapping hashes to do case-insensitive matching
    # against associated objects.  This allows CGI.pm to be
    # case-sensitive and still work with asssociate.
    my (%case_map, $lparam);
    foreach my $associated_object (@{$options->{associate}}) {
      # what a hack!  This should really be optimized out for
case_sensitive.
      if ($options->{case_sensitive}) {
        map {
          $case_map{$associated_object}{$_} = $_
        } $associated_object->param();
      } else {
        map {
          $case_map{$associated_object}{lc($_)} = $_
        } $associated_object->param();
      }
    }

    foreach my $param (keys %{$self->{param_map}}) {
      unless (defined($self->param($param))) {
      OBJ: foreach my $associated_object (reverse
@{$options->{associate}}) {
          $self->param($param, scalar
$associated_object->param($case_map{$associated_object}{$param})),
last OBJ
            if (exists($case_map{$associated_object}{$param}));
        }
      }
    }
  }

with this code:

  # support the associate magic, searching for undefined params and
  # attempting to fill them from the associated objects.
  if (scalar(@{$options->{associate}})) {
    my @undef_params;
    foreach my $param (keys %{$self->{param_map}}) {
      next if (defined $self->param($param));
      push @undef_params, $param;
    }
    if (scalar(@undef_params)) {
      my $value;
      # if case sensitive mode or no CGI objects, we can use the
fast path
      if ($options->{case_sensitive} or (grep { !/^1/ } map {
UNIVERSAL::isa($_,'HTML::Template') } @{$options->{associate}}) == 0) {
        foreach my $param (@undef_params) {
          foreach my $associated_object (reverse
@{$options->{associate}}) {
            $value = $associated_object->param($param);
            next unless (defined $value);
            $self->param($param, scalar $value);
            last;
          }
        }
      } else {
        my %case_map;
        foreach my $associated_object (@{$options->{associate}}) {
          map { $case_map{$associated_object}{lc($_)} = $_ }
$associated_object->param();
        }
        my $associated_param;
        foreach my $param (@undef_params) {
          foreach my $associated_object (reverse
@{$options->{associate}}) {
            $associated_param = $case_map{$associated_object}{$param};
            next unless (defined $associated_param);
            $value = $associated_object->param($associated_param);
            next unless (defined $value);
            $self->param($param, scalar $value);
            last;
          }
        }
      }
    }
  }

The can result form a small 10% speed up, to more than 20x speed up,
depending on the template.


regards,
Mathew

-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
Html-template-users mailing list
Html-template-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/html-template-users

Reply via email to