我在建立一個編譯器與reflection.emit在業餘時間,我來到一個問題,我不理解。System.AccessViolationException存儲變量與reflectio.emit
一個小的上下文,我有一個運行時帶有幾個類型,其中之一是Float2,一個簡單的矢量結構與兩個浮點值(X和Y)。我製作了一些讓我調整價值的屬性(一個lalsl)。例如,如果我有一個新的Float2(1.0f,2.0f),如果我做一些像(新的Float2(1.0f,2.0f))。YX我會得到一個Float2(2.0f,1.0f) 我在我的語言使用這種類型的和目前正在測試這種情況下(省略語的小細節):
float2 a = float2(1.0, 2.0).yx;
return a;
我在一個新的呼叫轉化FLOAT2(1.0,2.0)和訪問的性質YX我的Float2類型在.yx中。
問題是我得到一個「System.AccessViolationException:嘗試讀取或寫入受保護的內存,這通常表示其他內存已損壞。」我不明白爲什麼,因爲如果我做這樣的事情:
float2 a = float2(1.0, 2.0);
return a;
一切順利。
的IL代碼,我生成如下(我認爲在出現問題「L_0014:stloc.0」,我不知道爲什麼會發生,雖然)的
.method public virtual final instance valuetype
[Bifrost.Psl]Bifrost.Psl.Compiler.Runtime.Float2 Main() cil managed
{
.maxstack 3
.locals init (
[0] valuetype [Bifrost.Psl]Bifrost.Psl.Compiler.Runtime.Float2 num)
L_0000: ldc.r4 1
L_0005: ldc.r4 2
L_000a: newobj instance void [Bifrost.Psl]Bifrost.Psl.Compiler.Runtime.Float2::.ctor(float32, float32)
L_000f: call instance valuetype [Bifrost.Psl]Bifrost.Psl.Compiler.Runtime.Float2 [Bifrost.Psl]Bifrost.Psl.Compiler.Runtime.Float2::get_XY()
L_0014: stloc.0
L_0015: ldloc.0
L_0016: ret
}
結果peverify:
[IL]:錯誤:[偏移0x0000000F] [ 'Bifrost.Psl.Compiler.Runtime.Float2' 發現值] [預期的值 'Bifrost.Psl.Compiler.Runtime.Float2' 地址]意外鍵入堆棧。
我沒有看到IL的任何錯誤。我必須猜測問題是在構造函數或XY屬性getter中。您的代碼片段很糟糕,它們缺少* new *關鍵字。 – 2010-07-05 16:31:15
對不起,但用我的語言沒有新的。 float2(1.0,2.0)創建值。對於IL我爲這條指令生成一個newobj – 2010-07-05 16:34:52