OSDN Git Service

... and more
authorHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Wed, 14 Jan 2015 10:21:57 +0000 (19:21 +0900)
committerHironori Kitagawa <h_kitagawa2001@yahoo.co.jp>
Wed, 14 Jan 2015 10:21:57 +0000 (19:21 +0900)
 149867 words of node memory still in use:
   22 hlist, 2 vlist, 7 rule, 12 glue, 116 kern, 5 penalty, 2 glyph, 66124 attri
bute, 2452 glue_spec, 3224 attribute_list, 3 action, 1 write, 1 pdf_literal, 1 p
df_setmatrix, 2 pdf_save, 2 pdf_restore, 37 user_defined nodes
   avail lists: 1:8,2:156572,3:3623,4:16650,5:6634,6:4957,7:10015,8:81,9:9416,10
:680

src/ltj-direction.lua

index 7e07285..88ea22a 100644 (file)
@@ -62,17 +62,30 @@ end
 
 local page_direction
 --
-local ensure_tex_attr
+local ensure_tex_attr, copy_dir_pool
 do
    local tex_set_attr = tex.setattribute
-   local tex_get_attr = tex.getattribute
+   local tex_get_attr, node_copy = tex.getattribute, Dnode.copy
    function ensure_tex_attr(a, v)
       if tex_get_attr(a)~=v then
         tex_set_attr('global', a, v)
       end
    end
+   local dir_pool = {}
+   for _,i in pairs({dir_tate, dir_yoko, dir_dtou, dir_utod}) do
+      local w = node_new(id_whatsit, sid_user)
+      set_attr(w, attr_dir, i)
+      setfield(w, 'user_id', DIR)
+      setfield(w, 'type', 110)
+      setfield(w, 'next', nil)
+      dir_pool[i] = w
+   end
+   function copy_dir_pool(d)
+      return node_copy(dir_pool[d])
+   end
 end
 
+
 local function adjust_badness(hd)
    if not node_next(hd) and getid(hd)==id_whatsit and getsubtype(hd)==sid_user
    and getfield(hd, 'user_id')==DIR then
@@ -176,11 +189,7 @@ do
          v = get_adjust_dir_count()
       end
       local h = to_direct(tex_nest[lv].head)
-      local w = node_new(id_whatsit, sid_user)
-      setfield(w, 'next', nil)
-      setfield(w, 'user_id', DIR)
-      setfield(w, 'type', 110)
-      set_attr(w, attr_dir, v)
+      local w = copy_dir_pool(v)
       insert_after(h, h, w)
       tex_nest[lv].tail = to_node(node_tail(w))
       ensure_tex_attr(attr_icflag, 0)
@@ -220,11 +229,7 @@ do
            node_set_attr(w, attr_dir, v)
            if lv==0 then page_direction = v end
         else
-           local w = node_new(id_whatsit, sid_user)
-           setfield(w, 'next', nil)
-           setfield(w, 'user_id', DIR)
-           setfield(w, 'type', 110)
-           set_attr(w, attr_dir, v)
+           local w = copy_dir_pool(v)
            Dnode.write(w)
            if lv==0 then page_direction = v end
         end
@@ -249,11 +254,8 @@ local function create_dir_whatsit(hd, gc, new_dir)
       ensure_tex_attr(attr_icflag, 0)
       return hd
    else
-      local w = node_new(id_whatsit, sid_user)
+      local w = copy_dir_pool(new_dir)
       setfield(w, 'next', hd)
-      setfield(w, 'user_id', DIR)
-      setfield(w, 'type', 110)
-      set_attr(w, attr_dir, new_dir)
       set_attr(w, attr_icflag, PROCESSED_BEGIN_FLAG)
       set_attr(hd, attr_icflag,
               get_attr_icflag(hd) + PROCESSED_BEGIN_FLAG)
@@ -941,11 +943,7 @@ do
         end
         for box_rule in traverse(h) do
            if getid(box_rule)<id_rule then
-              local w = node_new(id_whatsit, sid_user)
-              setfield(w, 'next', nil)
-              setfield(w, 'user_id', DIR)
-              setfield(w, 'type', 110)
-              set_attr(w, attr_dir, list_dir)
+              local w = copy_dir_pool(list_dir)
               h = insert_before(h, box_rule, w)
            end
         end