Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

オブジェクト追跡の自動テスト実装 #13

Closed
yossi-tahara opened this issue Dec 14, 2016 · 3 comments
Closed

オブジェクト追跡の自動テスト実装 #13

yossi-tahara opened this issue Dec 14, 2016 · 3 comments

Comments

@yossi-tahara
Copy link
Owner

yossi-tahara commented Dec 14, 2016

トップ・レベルにおける保存/回復の実装が概ね完了したので、プッシュします。

コミットを細かく刻む方向にしようと考えているのですが、今回はコミットを刻みこそないました。
今後、もう少し刻むよう努力します。

★1点仕様を検討中です。
普通にクラス・オブジェクトを保存する際、同じ領域を複数回保存してもエラー・チェックできないため、エラーにできません。・・・(1)
しかし、オブジェクト追跡している時は、同じ領域が複数回保存されると回復時混乱するため、エラーにしてました。
そして、クラス・オブジェクトへのポインタをシリアライズした場合、そのクラスのオブジェクトを全て自動的にオブジェクト追跡します。

クラスのバリエーション・テストで複数回保存していた(1)のクラスを、今回のオブジェクト追跡テストに用いたところ、クラスのバリエーション・テストでエラーが発生するようになりました。
私自身が原因追求に苦しんだため、一旦、(1)のケースはエラーにならないように修正しました。

だがしかし、本質的にエラーを検出した方がユーザのバグを検出しやすいです。
なので、どうするか検討中です。

@yossi-tahara
Copy link
Owner Author

同じ領域を複数回保存/回復する件

この件について検討しました。
オブジェクト追跡を開発した当初、同じ領域を複数回保存すると回復時、混乱すると考えました。
オブジェクト追跡している時はそれを検出できるため、検出した時エラーにしました。
しかし、よく考えてみると同じ領域を複数回保存しても混乱しません。「同じ領域」のアドレスは同じです。それを複数回保存してもオブジェクト追跡するアドレスは変わらないのでポインタの保存/回復に支障はないのです。

そこで、今回、オブジェクト追跡のエラー処理を見直し、同じ領域の複数回の保存/回復はエラーにしないようにしました。

yossi-tahara added a commit that referenced this issue Dec 20, 2016
  通常ポインタのオブジェクト追跡実装完了
    自動型と手動型の保存/回復
    非constポインタのテスト追加

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 7e039fe85ae29b7b5a619d85fa82fb24
TheolizerLibrary : 3aa647a8a4af09e5614b6318d02b1315
Library's Header : a401c2cf4493033d4fbfe383a8af5052
yossi-tahara added a commit that referenced this issue Dec 27, 2016
THEOLIZER_PROCESS_OWNER()がポインタの配列をエラーにしていたので修正。
    ポインタのみ許可していた。ポインタの配列も許可する。

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 3783b46bbd6c21d319f84b8e56b8b063
TheolizerLibrary : 056dda7dee327c9f714b054fa58926e0
Library's Header : 71814fc0843a0642c43e62a3a77e2705

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 3783b46bbd6c21d319f84b8e56b8b063
TheolizerLibrary : 056dda7dee327c9f714b054fa58926e0
Library's Header : 71814fc0843a0642c43e62a3a77e2705
yossi-tahara added a commit that referenced this issue Dec 27, 2016
THEOLIZER_PROCESS_OWNER()がポインタの配列をエラーにしていたので修正。
    ポインタのみ許可していた。ポインタの配列も許可する。

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 3783b46bbd6c21d319f84b8e56b8b063
TheolizerLibrary : 056dda7dee327c9f714b054fa58926e0
Library's Header : 71814fc0843a0642c43e62a3a77e2705
yossi-tahara added a commit that referenced this issue Jan 4, 2017
  2番目の基底クラス対応不具合のある旧コードを削除した。
  自動テスト内容修正と追加
    手動型の保存/回復テスト追加
    基底クラスの設定値を派生クラス側で決定できるように変更。
    自動型の基底クラスを抽象クラスとした。
  手動型の基底クラスを抽象クラスにすることは非サポートとした。

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 463af7f4ad911a462d28269becfac018
TheolizerLibrary : c3258b874dce8a6a5ca7701809a957c0
Library's Header : 7d8420e2feb16e770f58334e816f21f8
@yossi-tahara
Copy link
Owner Author

yossi-tahara commented Jan 4, 2017

あけましておめでとうございます。

やっとポリモーフィズムを含むオブジェクト追跡の自動テストの実装を完了しました。
大きな問題点が2つ見つかりました。

2番目以降の基底クラスへのポインタから派生クラスをシリアライズする時の不具合修正

動的処理するために、ポインタを一度void*へ変更していたため、2番目以降の基底クラスへのポインタで派生クラスを保存/回復する時、ポインタの指すアドレスを適切に変換できていませんでした。

2番目以降の基底クラスへのポインタのアドレス != 派生クラスへのポインタのアドレスなので、この変換はコンパイラに任せる必要があるのに、void*へreinterpret_castしていたため、アドレス変換されず不適切なアドレスでシリアライズ処理してました。

ポリモーフィズム対応処理を全体的に見直し、基底クラスへのポインタと派生クラスへのポインタを変換する時は、static_cast<>で変換できるよう静的処理するように変更しました。
その際、旧バージョンと新バージョンで基底クラスを変更するようなケースへの対応を断念しました。
恐らく、頑張ればこのケースにも対応できると思いますが、レアな要求と思いますので、現段階では断念します。
将来的に要求が発生した時に再度検討します。

非侵入型手動クラスを抽象クラスにすることを非サポート

非侵入型完全自動クラスと侵入型半自動クラスは、メンバ変数をTheolizerが別途生成して管理するため、抽象型でも領域確保でき、サポートできます。
しかし、非侵入型手動クラスは、メンバ変数をプログラマが管理するため、抽象型の記憶領域はクラス自身が管理します。

自動型はそれが包含するクラスについて、クラス毎にバージョン間の引き継ぎを行います。
そして、新バージョンで基底クラスが削除された時、旧バージョン形式で保存する場合に、旧バージョンへ引き継ぐ基底クラスの記憶領域を確保する必要があります。この時、抽象クラスでは、単独でコンストラクトできないため、その記憶領域の確保ができないことが原因です。

領域確保するための派生クラスをドライバにて自動生成する等の手法でサポートすることは可能と思いますが、現時点では保留します。
将来的に要求が発生した時に再度検討します。

yossi-tahara added a commit that referenced this issue Jan 12, 2017
  バージョン名の-Prerelease.を外す。

----------------- MD5 Hash Values -----------------
TheolizerDriver  : 6d52e3e0546d7b69fef4e8d5e8ab3d45
TheolizerLibrary : c22dbeac8963bdecb4a70dc2f7cc234e
Library's Header : 746959b760b766a8c6dcd23aa380b2c7
@yossi-tahara
Copy link
Owner Author

実装完了し、v.0.4.2としてリリースしましたので、クローズします。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant