aviutl_exedit_sdk icon indicating copy to clipboard operation
aviutl_exedit_sdk copied to clipboard

メモリ参照情報の追加

Open kumrnm opened this issue 3 years ago • 2 comments

本リクエストでは、拡張編集の内部変数の情報(型とオフセットアドレス)をSDKに含めることを提案します。これにより、SDKとしての機能性が向上するのみならず、現状では各々のプロジェクトに分散している解析情報を本リポジトリに集約する効果が期待されます。

添付されているコードは設計の一案であり、試験的にAulsメモリ参照に含まれる変数情報を記載しています。想定される使用例は以下の通りです。

// 拡張編集 version0.92 のみに対応する例

#include <exedit.hpp>

extern unsigned int g_exedit_base;

void foo() {
	const auto objs = *ExEdit::Variables::get092<ExEdit::Variables::sortedObjectTable>(g_exedit_base);
	const auto n = *ExEdit::Variables::get092<ExEdit::Variables::sortedObjectTable::length>(g_exedit_base);

	// ...
}
// 拡張編集 version0.92 および 0.93rc1 に対応する例

#include <exedit.hpp>

extern unsigned int g_exedit_base;
extern ExEditVersion g_exedit_version;

template<typename Variable>
Variable::reference_type get_variable() {
	if (g_exedit_version == ExEditVersion::version092) {
		return ExEdit::Variables::get092<Variable>(g_exedit_base);
	}
	else if (g_exedit_version == ExEditVersion::version093rc1) {
		return ExEdit::Variables::get093rc1<Variable>(g_exedit_base);
	}
	else {
		return nullptr;
	}
}

void foo() {
	const auto objs = *get_variable<ExEdit::Variables::sortedObjectTable>();
	
	// この行はコンパイル不可(0.93rc1のオフセット情報が存在しないため)
	// const auto n = *get_variable<ExEdit::Variables::sortedObjectTable::length>();

	// ...
}

ご検討のほどよろしくお願い致します。

(2022/4/24 12:05追記)いくつかの誤りを修正しました

kumrnm avatar Apr 23 '22 13:04 kumrnm

アドレスを書いてしまうの、あまりやりたくなかったことでした なんでなのかの言語化はちょっとまだできません 何か私が納得できる実装方法を思いついたら、それをやるかもしれません(逆に言えばこの実装は何かが嫌です)

ePi5131 avatar May 03 '22 02:05 ePi5131

バージョン名を含む関数がExEdit::Variablesにぶら下がっているのが気持ち悪いかもしれません。

サポート対象をマクロで記述させる案もあります(ヘッダライブラリがstatefulになるのは個人的にあまり好みではないのですが)

#define SUPPORT_EXEDIT092
#define SUPPORT_EXEDIT093rc1
#include <exedit.hpp>

BOOL func_init(AviUtl::FilterPlugin* fp) {
    // 非対応バージョンならば runtime_error
    ExEdit::Variables::init(fp);

    // ...
}

void foo() {
    // 解析情報が存在しなければコンパイルエラー
    const auto objs = *ExEdit::Variables::get<ExEdit::Variables::sortedObjectTable>();

    // 解析情報が存在しなければ nullptr を返す
    const auto n_ptr = ExEdit::Variables::get_nullable<ExEdit::Variables::sortedObjectTable::length>();

    // いずれも ExEdit::Variables::init() より前に呼び出したら runtime_error
    
    // ...
}

kumrnm avatar May 03 '22 07:05 kumrnm