Author: stsp
Date: Thu Apr 22 23:11:48 2010
New Revision: 937098

URL: http://svn.apache.org/viewvc?rev=937098&view=rev
Log:
Digest feedback by gstein for r936844.

* subversion/libsvn_subr/subst.c
  (keywords_hash_deep_copy): Remove. No longer needed as per change below.
  (dup_translation_baton): Don't make a deep copy of keywords, since they
   have at last the same lifetime as the translated stream.
  (mark_translated_t): Rather than storing a pointer to the saved baton,
   use a nested struct. Saves an allocation and some dereferencing.
  (translated_stream_mark, translated_stream_seek): Rename MARK_TRANSLATED
   to just MT for readability. Track above change in mark_translated_t.
  (svn_subst_stream_translated): Restore the body of keywords_hash_deep_copy()
   here. It's not used elsewhere anymore so there is no point in having a
   separate function.

Modified:
    subversion/trunk/subversion/libsvn_subr/subst.c

Modified: subversion/trunk/subversion/libsvn_subr/subst.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_subr/subst.c?rev=937098&r1=937097&r2=937098&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_subr/subst.c (original)
+++ subversion/trunk/subversion/libsvn_subr/subst.c Thu Apr 22 23:11:48 2010
@@ -839,31 +839,9 @@ create_translation_baton(const char *eol
   return b;
 }
 
-/* Create a deep copy of the KEYWORDS hash, allocated in RESULT_POOL,
- * and return a pointer to it. */
-static apr_hash_t *
-keywords_hash_deep_copy(apr_hash_t *keywords, apr_pool_t *result_pool)
-{
-  apr_hash_t *copy = apr_hash_make(result_pool);
-  apr_hash_index_t *hi;
-
-  for (hi = apr_hash_first(result_pool, keywords);
-       hi; hi = apr_hash_next(hi))
-    {
-      const void *key;
-      void *val;
-
-      apr_hash_this(hi, &key, NULL, &val);
-      apr_hash_set(copy, apr_pstrdup(result_pool, key),
-                   APR_HASH_KEY_STRING,
-                   svn_string_dup(val, result_pool));
-    }
-
-  return copy;
-}
-
 /* Create a deep copy of TRANSLATION_BATON, allocated in RESULT_POOL,
- * and return a pointer to it. */
+ * and return a pointer to it. Note that no deep copy is made of keywords,
+ * since keywords are constant over the lifetime of the translation stream. */
 static struct translation_baton *
 dup_translation_baton(const struct translation_baton *translation_baton,
                       apr_pool_t *result_pool)
@@ -871,8 +849,7 @@ dup_translation_baton(const struct trans
   struct translation_baton *b = apr_palloc(result_pool, sizeof(*b));
 
   *b = *translation_baton;
-  b->keywords = keywords_hash_deep_copy(translation_baton->keywords,
-                                        result_pool);
+
   return b;
 }
 
@@ -1205,7 +1182,7 @@ translated_stream_reset(void *baton)
 typedef struct
 {
   /* Saved translation state. */
-  struct translated_stream_baton *saved_baton;
+  struct translated_stream_baton saved_baton;
 
   /* Mark set on the underlying stream. */
   svn_stream_mark_t *mark;
@@ -1215,24 +1192,21 @@ typedef struct
 static svn_error_t *
 translated_stream_mark(void *baton, svn_stream_mark_t **mark, apr_pool_t *pool)
 {
-  mark_translated_t *mark_translated;
+  mark_translated_t *mt;
   struct translated_stream_baton *b = baton;
-  struct translated_stream_baton *sb;
   
-  mark_translated = apr_palloc(pool, sizeof(*mark_translated));
-  SVN_ERR(svn_stream_mark(b->stream, &mark_translated->mark, pool));
+  mt = apr_palloc(pool, sizeof(*mt));
+  SVN_ERR(svn_stream_mark(b->stream, &mt->mark, pool));
 
   /* Save translation state. */
-  sb = apr_pcalloc(pool, sizeof(*sb));
-  sb->in_baton = dup_translation_baton(b->in_baton, pool);
-  sb->out_baton = dup_translation_baton(b->out_baton, pool);
-  sb->written = b->written;
-  sb->readbuf = svn_stringbuf_dup(b->readbuf, pool);
-  sb->readbuf_off = b->readbuf_off;
-  sb->buf = apr_pmemdup(pool, b->buf, SVN__STREAM_CHUNK_SIZE + 1);
+  mt->saved_baton.in_baton = dup_translation_baton(b->in_baton, pool);
+  mt->saved_baton.out_baton = dup_translation_baton(b->out_baton, pool);
+  mt->saved_baton.written = b->written;
+  mt->saved_baton.readbuf = svn_stringbuf_dup(b->readbuf, pool);
+  mt->saved_baton.readbuf_off = b->readbuf_off;
+  mt->saved_baton.buf = apr_pmemdup(pool, b->buf, SVN__STREAM_CHUNK_SIZE + 1);
 
-  mark_translated->saved_baton = sb;
-  *mark = (svn_stream_mark_t *)mark_translated;
+  *mark = (svn_stream_mark_t *)mt;
 
   return SVN_NO_ERROR;
 }
@@ -1242,23 +1216,21 @@ static svn_error_t *
 translated_stream_seek(void *baton, svn_stream_mark_t *mark)
 {
   struct translated_stream_baton *b = baton;
-  struct translated_stream_baton *sb;
-  mark_translated_t *mark_translated = (mark_translated_t *)mark;
+  mark_translated_t *mt = (mark_translated_t *)mark;
 
   /* Flush output buffer if necessary. */
   if (b->written)
     SVN_ERR(translate_chunk(b->stream, b->out_baton, NULL, 0, b->iterpool));
 
-  SVN_ERR(svn_stream_seek(b->stream, mark_translated->mark));
+  SVN_ERR(svn_stream_seek(b->stream, mt->mark));
 
   /* Restore translation state. */
-  sb = mark_translated->saved_baton;
-  b->in_baton = dup_translation_baton(sb->in_baton, b->pool);
-  b->out_baton = dup_translation_baton(sb->out_baton, b->pool);
-  b->written = sb->written;
-  b->readbuf = svn_stringbuf_dup(sb->readbuf, b->pool);
-  b->readbuf_off = sb->readbuf_off;
-  b->buf = apr_pmemdup(b->pool, sb->buf, SVN__STREAM_CHUNK_SIZE + 1);
+  b->in_baton = dup_translation_baton(mt->saved_baton.in_baton, b->pool);
+  b->out_baton = dup_translation_baton(mt->saved_baton.out_baton, b->pool);
+  b->written = mt->saved_baton.written;
+  b->readbuf = svn_stringbuf_dup(mt->saved_baton.readbuf, b->pool);
+  b->readbuf_off = mt->saved_baton.readbuf_off;
+  b->buf = apr_pmemdup(b->pool, mt->saved_baton.buf, SVN__STREAM_CHUNK_SIZE + 
1);
 
   return SVN_NO_ERROR;
 }
@@ -1325,7 +1297,22 @@ svn_subst_stream_translated(svn_stream_t
       else
         {
           /* deep copy the hash to make sure it's allocated in BATON_POOL */
-          keywords = keywords_hash_deep_copy(keywords, baton_pool);
+          apr_hash_t *copy = apr_hash_make(baton_pool);
+          apr_hash_index_t *hi;
+
+          for (hi = apr_hash_first(pool, keywords);
+               hi; hi = apr_hash_next(hi))
+            {
+              const void *key;
+              void *val;
+
+              apr_hash_this(hi, &key, NULL, &val);
+              apr_hash_set(copy, apr_pstrdup(baton_pool, key),
+                           APR_HASH_KEY_STRING,
+                           svn_string_dup(val, baton_pool));
+            }
+
+            keywords = copy;
         }
     }
 


Reply via email to