当看到未提取WeakPtr
在里面!8597(关闭)我实现我们使用运行时间代表
操作中的多态性捕捉#
和保持活动状态#
不健全。
微型复制机
以下程序分段错误主人
使用NCG和未注册的后端:
{-#LANGUAGE魔法哈希#-}
{-#LANGUAGE未装箱双元组#-}
进口 全球总部。IO(输入输出)
进口 全球总部。Exts(扩展名)
主要的 :: IO(输入输出) ()
主要的 = 做
第页 <- IO(输入输出) $ \s0 ->
案例 抓住# 国际奥委会 处理程序 第0集 属于
(# 第1页, (# 编号0,n1个,氮气,第三名,第4名,第5名,第6名,第7名 #) #) -> (# 第1页, (编号0,n1个,氮气,第三名,第4名,第5名,第6名,第7名) #)
打印 第页
打印 “你好,世界”
类型 结果 = (# 国际, 国际, 国际, 国际, 国际, 国际, 国际, 国际 #)
{-#NOINLINE io#-}
国际奥委会 :: 州# 真实世界 -> (# 州# 真实世界, 结果 #)
国际奥委会 秒 = (# 秒, (# n个,n个,n个,n个,n个,n个,n个,n个 #) #)
哪里
n个 = 1
{-#NOINLINE处理程序#-}
处理程序 e(电子) = 未定义
出了什么问题?
要了解失败的原因,请考虑以下程序:
内部的 :: 州# 真实世界 -> (# 州# 真实世界, 国际, 国际 #)
内部的 =
。。。
(# 秒, 一, b #)
do_it(_I) =
。。。 保持活动状态# x个 秒 内部的
回想一下保持活动状态#
类型为:
keepAlive#::for all(a_lev::Levity)(a::TYPE(BoxedRep-lev))
(r_rep::RuntimeRep)(r::TYPE r_rep)。
a->状态#RealWorld->(状态#Real World->r)->r
我们认为代表性多态结果类型是安全的(因为我们只返回结果,不需要绑定它),并且很有用(因为它允许用户,例如,取消对国际
结果。
然而,如果我们考虑一下这个程序的操作行为,我们就会发现潜在的问题。特别是,想象一下当我们进入保持活动状态#
调用堆栈的状态(编译时未注册)如下:
┌──────────────────┐ ◄──── 服务提供商
│ 内部│
├──────────────────┤
│ K│
└──────────────────┘
哪里
-
K(K)
表示封闭上下文(它应该返回一个(#状态#真实世界,Int,Int#)
,将表示为两个国际
堆栈顶部的指针)
-
内部的
是传递给的continuation参数保持活动状态#
- 第一个参数,
x个
,传入`R1
什么时候?保持活动状态#
电话内部的
我们将拥有:
——————————————————————————————————————————————————服务提供商
│ 保持活动框架
│ x│
├──────────────────┤
│ K│
└──────────────────┘
最终内部的
将收敛到一个结果,从而生成堆栈:
┌──────────────────┐ ◄──── 服务提供商
│ a│
│ b│
├──────────────────┤
│ 保持活动_帧│
│ x│
├──────────────────┤
│ K│
└──────────────────┘
哪里一
和b
是内部的
的两个结果。
内部的
然后将返回到保持活动_帧
的条目代码。然而,入口代码无法知道堆栈顶部有多少结果。