6.24. kink/TRACE

6.24.1. trace型

traceは、スタックトレースの要素である。

traceは次の属性からなる。

• Sym: 呼ばれた関数のシンボルのstr値。

• Location: 呼び出しが起きた場所のlocation値。

• Tail?: 呼び出しが末尾呼び出しかどうかのbool値。

6.24.1.1. Trace.sym

symは、Traceの属性Symを戻す。

6.24.1.2. Trace.location

locationは、Traceの属性Locationを戻す。

6.24.1.3. Trace.tail?

tail?は、Traceの属性Tail?を戻す。

6.24.1.4. Trace.desc

descは、Traceを記述するstr値を戻す。

Tail?属性がtrueの場合、結果の最初の部分は "{...}" のように中括弧に囲まれる。

Tail?属性がfalseの場合、結果の最初の部分は "[...]" のように大括弧に囲まれる。

:TRACE.require_from('kink/')
:LOCATION.require_from('kink/program/')
:PROGRAM.require_from('kink/program/')

:Loc <- LOCATION.new(PROGRAM.new('foo.kn' 'foo(bar)') 4)

stdout.print_line(TRACE.new('bar' Loc).desc.repr)
# => "[foo.kn L1 C5 bar] foo(-->bar)"

stdout.print_line(TRACE.new('bar' LOCATION.empty).desc.repr)
# => "[bar]"

stdout.print_line(TRACE.new('bar' LOCATION.empty){(:C) C.tail }.desc.repr)
# => "{bar}"

stdout.print_line(TRACE.new('' Loc).desc.repr)
# => "[foo.kn L1 C5] foo(-->bar)"

stdout.print_line(TRACE.new('' Loc){(:C) C.tail }.desc.repr)
# => "{foo.kn L1 C5} foo(-->bar)"

stdout.print_line(TRACE.snip.desc.repr)
# => "{..snip..}"

stdout.print_line(TRACE.new('' LOCATION.empty).desc.repr)
# => "[..empty..]"

6.24.1.5. Trace1 == Trace2

== 演算子、つまりop_eqメソッドは、Trace1とTrace2が同値の属性を持っているかどうかを戻す。

事前条件

Trace2はtrace値でなければならない。

6.24.2. TRACE.new(Sym Location ...[$config={}])

newは、新しいtrace値を戻す。

コンフィグメソッド:

• C.tail

結果のtrace値は、SymとLocationを同名の属性として持つ。C.tailが呼ばれた場合、Tail?はtrueになる。C.tailが呼ばれなかった場合、Tail?はfalseになる。

事前条件

Symはstrでなければならない。

Locationはlocationでなければならない。

:TRACE.require_from('kink/')
:LOCATION.require_from('kink/program/')
:PROGRAM.require_from('kink/program/')

:T1 <- TRACE.new('op_add' LOCATION.new(PROGRAM.new('foo.kn' '10+20') 2))
stdout.print_line(T1.repr) # => (trace sym=op_add (location foo.kn L1 C3) tail?=false)

:T2 <- TRACE.new('bar' LOCATION.new(PROGRAM.new('bar.kn' 'bar(X)') 0)){(:C) C.tail }
stdout.print_line(T2.repr) # => (trace sym=bar (location bar.kn L1 C1) tail?=true)

6.24.3. TRACE.is?(Val)

is?は、Valがtraceであるかどうかを戻す。

6.24.4. TRACE.snip

snipは、Sym=, Location=LOCATION.empty, Tail?=trueであるようなtrace値を戻す。

このtrace値は、省略された末尾呼び出しのトレースを置き換えるのに使われる。

6.24.5. TRACE.current_traces

current_tracesは、抽象スタックマシンのスタックのtraceを、底からトップの順序で、vecとして戻す。

current_tracesの呼び出しの最後では、次の抽象命令列が評価される。

(traces)