Giraffe+ 0.5.50.642

Downloadページへ

前リリースからの変化

  • 設定ダイアログ表示時、ツリーがフォーカスを得てなかったのを修正
  • VoidのPointerには何のポインタでも無条件で代入可能にした
  • StructやC_arrayのポインタの代入可能性を決める実装が動作してなかったのを修正
  • 同じインスタンスで別の型のポインタを返すPointer.reinterpretを定義
  • 旧言語用のディープパースをデフォルトで無効にした
  • スレッド描画を一本のスレッドにできるようにした

設定ダイアログ表示時、ツリーがフォーカスを得てなかったのを修正

リサイザブルにしたときからなってました。まあいいかと放置してたんですが、やっぱりうざったいので直しました。

VoidのPointerには何のポインタでも無条件で代入可能にした

内部的にはその仕様を意識していろいろ小細工してたんですが、スクリプト側のほうはすっかり忘れてました。

StructやC_arrayのポインタの代入可能性を決める実装が動作してなかったのを修正

なぜかテストもしてませんでした。以下、ポインタの代入可能性を決めるややこしい仕様。

  1. Pointerのインスタンスp1に対して別のPointerのインスタンスp2が代入可能(p1 = p2を実行可能)かどうかは、p2.@typeがp1.@typeとして参照可能かどうかで決まる。
  2. 参照可能とは、型が同じで「右辺だけがconst」以外の状態。
  3. 左辺の@typeがVoidの場合右辺の型と関係なく常に可能。
  4. 暗黙の型変換(as_*)は考慮しない。(C++の継承関係(アップキャスト)は非対応)。
  5. Struct, C_array, Pointerが@typeであった場合、それらの@typeを再帰的に調べる。
  6. Struct_typeが@typeであった場合、その内部の型を再帰的に調べる。

例えばintのみで構成される構造体のポインタはint constのみで構成される構造体のポインタに代入可能です。
再帰的な仕様なので、再帰的に考えると、独立した単純な仕様が複数あるだけになり、あまりややこしくありません。

同じインスタンスで別の型のポインタを返すPointer.reinterpretを定義

Pointer.to_Pointerは別インスタンスを返します。
Char*にreinterpretしてポインタを1byte進める例:

n: 0
p: n.ref
p1: p.reinterpret(Char)
p1.++
p.to_Uint.== (n.ref.to_Uint.++)

旧言語用のディープパースをデフォルトで無効にした

ブロックを引数に取る旧言語の関数(if等)の文字列の引数をパース時にブロック化する作業のことです。起動や再設定が遅くなる代わりに実行効率はよくなります。そろそろ頻繁に使う部分は新言語化されてきたので、無効にしてみました。

Giraffe.EnableDeepParse(true)

で有効にできますが、パース時にどうするかの設定なので、.giraffeの初めにします。

スレッド描画を一本のスレッドにできるようにした

設定ダイアログのSettings/setup/SingleThreadDrawです。実行効率はこちらのほうがいいはずです。