ghostscript - CMap 定义中的 Ghostscript /stackunderflow
问题描述
我正在尝试创建一个带有两个 CID 映射的简单 CMap。知道跟随 CMap 有什么问题吗?
/CIDInit /ProcSet findresource begin
13 dict begin
begincmap /CIDSystemInfo <<
/Registry (Adobe) /Ordering (Identity) /Supplement 0 >> def
/CMapName /CM def
/CMapType 1 def
1 begincodespacerange
<00> <02>
endcodespacerange
2 begincidchar
<01> 6691
<02> 6692
endcidchar
endcmap CMapName currentdict /CMap defineresource
pop end end
gs 解释器抛出以下错误:
Error: /stackunderflow in --index--
Operand stack:
1 --nostringval-- (\002) 6691 (\001) (\000\000\000\002) () (\032#) 0 (\001) 10
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1992 1 3 %oparray_pop 1991 1 3 %oparray_pop 1979 1 3 %oparray_pop 1833 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- 1 --nostringval-- %repeat_continue --nostringval-- --nostringval--
Dictionary stack:
--dict:730/1123(ro)(G)-- --dict:0/20(G)-- --dict:75/200(L)-- --dict:38/38(ro)(G)-- --dict:8/13(L)--
Current allocation mode is local
Current file position is 270
GPL Ghostscript 9.27: Unrecoverable error, exit code 1
解决方案
这是一个错误,现在已修复。
对于单个代码映射(endnotdefchar/endcidchar),我们检查之前的映射值是否与当前的映射值相邻,因此我们可以通过将它们合并到一个范围中来进行优化。每个映射涉及堆栈上的 5 个条目,并且触发合并尝试的检查检查堆栈上的 >5 个条目。只要映射的数量足够大,我们总是有至少 10 个条目(合并代码将处理未处理的条目),它就可以工作。在这种情况下,我们只有两个映射,当我们检查一个marge condidate时,堆栈上有七个条目(当前5个,剩余映射2个),我们最终会出现stackunderflow错误,因为代码期望堆栈上至少有 10 个对象。
谢谢@chrisl
推荐阅读
- flask - 通过前端将用户指定的本地文件上传到 Google Cloud Storage
- google-sheets - 有没有办法在制作特定例外时计算工作表上的所有单词?
- android - 电池会话的含义?
- arrays - 数组没有填充正确的数据
- javascript - 使用 swig 创建 C++ 到 javascript 的包装器时生成错误
- asp.net-core - AspNet Core 定位导航属性
- sql-server - 同一台机器上的 SQL Server 2016 Express 版和开发者版
- symfony - Monolog vs worker vs supervisord
- r - 如何在每行的字符串之前和之后添加一个空格
- swift - Swift:条形图内容未水平居中