diff options
Diffstat (limited to 'tex/context/base/node-mig.lua')
-rw-r--r-- | tex/context/base/node-mig.lua | 276 |
1 files changed, 138 insertions, 138 deletions
diff --git a/tex/context/base/node-mig.lua b/tex/context/base/node-mig.lua index 9fc35a048..fd14fc43f 100644 --- a/tex/context/base/node-mig.lua +++ b/tex/context/base/node-mig.lua @@ -1,138 +1,138 @@ -if not modules then modules = { } end modules ['node-mig'] = { - version = 1.001, - comment = "companion to node-mig.mkiv", - author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", - copyright = "PRAGMA ADE / ConTeXt Development Team", - license = "see context related readme files" -} - -local format = string.format - -local attributes, nodes, node = attributes, nodes, node - -local remove_nodes = nodes.remove - -local nodecodes = nodes.nodecodes -local tasks = nodes.tasks - -local hlist_code = nodecodes.hlist -local vlist_code = nodecodes.vlist -local insert_code = nodecodes.ins -local mark_code = nodecodes.mark - -local a_migrated = attributes.private("migrated") - -local trace_migrations = false trackers.register("nodes.migrations", function(v) trace_migrations = v end) - -local report_nodes = logs.reporter("nodes","migrations") - -local migrate_inserts, migrate_marks, inserts_too - -local t_inserts, t_marks, t_sweeps = 0, 0, 0 - -local function locate(head,first,last,ni,nm) - local current = head - while current do - local id = current.id - if id == vlist_code or id == hlist_code then - current.list, first, last, ni, nm = locate(current.list,first,last,ni,nm) - current = current.next - elseif migrate_inserts and id == insert_code then - local insert - head, current, insert = remove_nodes(head,current) - insert.next = nil - if first then - insert.prev, last.next = last, insert - else - insert.prev, first = nil, insert - end - last, ni = insert, ni + 1 - elseif migrate_marks and id == mark_code then - local mark - head, current, mark = remove_nodes(head,current) - mark.next = nil - if first then - mark.prev, last.next = last, mark - else - mark.prev, first = nil, mark - end - last, nm = mark, nm + 1 - else - current= current.next - end - end - return head, first, last, ni, nm -end - -function nodes.handlers.migrate(head,where) - local done = false - if head then - if trace_migrations then - report_nodes("migration sweep %a",where) - end - local current = head - while current do - local id = current.id - -- inserts_too is a temp hack, we should only do them when it concerns - -- newly placed (flushed) inserts - if id == vlist_code or id == hlist_code or (inserts_too and id == insert_code) and not current[a_migrated] then - current[a_migrated] = 1 - t_sweeps = t_sweeps + 1 - local h = current.list - local first, last, ni, nm - while h do - local id = h.id - if id == vlist_code or id == hlist_code then - h, first, last, ni, nm = locate(h,first,last,0,0) - end - h = h.next - end - if first then - t_inserts, t_marks = t_inserts + ni, t_marks + nm - if trace_migrations and (ni > 0 or nm > 0) then - report_nodes("sweep %a, container %a, %s inserts and %s marks migrated outwards during %a", - t_sweeps,nodecodes[id],ni,nm,where) - end - -- inserts after head - local n = current.next - if n then - last.next, n.prev = n, last - end - current.next, first.prev = first, current - done, current = true, last - end - end - current = current.next - end - return head, done - end -end - --- for the moment this way, this will disappear - -experiments.register("marks.migrate", function(v) - if v then - tasks.enableaction("mvlbuilders", "nodes.handlers.migrate") - end - migrate_marks = v -end) - -experiments.register("inserts.migrate", function(v) - if v then - tasks.enableaction("mvlbuilders", "nodes.handlers.migrate") - end - migrate_inserts = v -end) - -experiments.register("inserts.migrate.nested", function(v) - if v then - tasks.enableaction("mvlbuilders", "nodes.handlers.migrate") - end - inserts_too = v -end) - -statistics.register("node migrations", function() - if trace_migrations and t_sweeps > 0 then - return format("%s sweeps, %s inserts moved, %s marks moved",t_sweeps,t_inserts,t_marks) - end -end) +if not modules then modules = { } end modules ['node-mig'] = {
+ version = 1.001,
+ comment = "companion to node-mig.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local format = string.format
+
+local attributes, nodes, node = attributes, nodes, node
+
+local remove_nodes = nodes.remove
+
+local nodecodes = nodes.nodecodes
+local tasks = nodes.tasks
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local insert_code = nodecodes.ins
+local mark_code = nodecodes.mark
+
+local a_migrated = attributes.private("migrated")
+
+local trace_migrations = false trackers.register("nodes.migrations", function(v) trace_migrations = v end)
+
+local report_nodes = logs.reporter("nodes","migrations")
+
+local migrate_inserts, migrate_marks, inserts_too
+
+local t_inserts, t_marks, t_sweeps = 0, 0, 0
+
+local function locate(head,first,last,ni,nm)
+ local current = head
+ while current do
+ local id = current.id
+ if id == vlist_code or id == hlist_code then
+ current.list, first, last, ni, nm = locate(current.list,first,last,ni,nm)
+ current = current.next
+ elseif migrate_inserts and id == insert_code then
+ local insert
+ head, current, insert = remove_nodes(head,current)
+ insert.next = nil
+ if first then
+ insert.prev, last.next = last, insert
+ else
+ insert.prev, first = nil, insert
+ end
+ last, ni = insert, ni + 1
+ elseif migrate_marks and id == mark_code then
+ local mark
+ head, current, mark = remove_nodes(head,current)
+ mark.next = nil
+ if first then
+ mark.prev, last.next = last, mark
+ else
+ mark.prev, first = nil, mark
+ end
+ last, nm = mark, nm + 1
+ else
+ current= current.next
+ end
+ end
+ return head, first, last, ni, nm
+end
+
+function nodes.handlers.migrate(head,where)
+ local done = false
+ if head then
+ if trace_migrations then
+ report_nodes("migration sweep %a",where)
+ end
+ local current = head
+ while current do
+ local id = current.id
+ -- inserts_too is a temp hack, we should only do them when it concerns
+ -- newly placed (flushed) inserts
+ if id == vlist_code or id == hlist_code or (inserts_too and id == insert_code) and not current[a_migrated] then
+ current[a_migrated] = 1
+ t_sweeps = t_sweeps + 1
+ local h = current.list
+ local first, last, ni, nm
+ while h do
+ local id = h.id
+ if id == vlist_code or id == hlist_code then
+ h, first, last, ni, nm = locate(h,first,last,0,0)
+ end
+ h = h.next
+ end
+ if first then
+ t_inserts, t_marks = t_inserts + ni, t_marks + nm
+ if trace_migrations and (ni > 0 or nm > 0) then
+ report_nodes("sweep %a, container %a, %s inserts and %s marks migrated outwards during %a",
+ t_sweeps,nodecodes[id],ni,nm,where)
+ end
+ -- inserts after head
+ local n = current.next
+ if n then
+ last.next, n.prev = n, last
+ end
+ current.next, first.prev = first, current
+ done, current = true, last
+ end
+ end
+ current = current.next
+ end
+ return head, done
+ end
+end
+
+-- for the moment this way, this will disappear
+
+experiments.register("marks.migrate", function(v)
+ if v then
+ tasks.enableaction("mvlbuilders", "nodes.handlers.migrate")
+ end
+ migrate_marks = v
+end)
+
+experiments.register("inserts.migrate", function(v)
+ if v then
+ tasks.enableaction("mvlbuilders", "nodes.handlers.migrate")
+ end
+ migrate_inserts = v
+end)
+
+experiments.register("inserts.migrate.nested", function(v)
+ if v then
+ tasks.enableaction("mvlbuilders", "nodes.handlers.migrate")
+ end
+ inserts_too = v
+end)
+
+statistics.register("node migrations", function()
+ if trace_migrations and t_sweeps > 0 then
+ return format("%s sweeps, %s inserts moved, %s marks moved",t_sweeps,t_inserts,t_marks)
+ end
+end)
|