2010-07-05 50 views
1

我在建立一個編譯器與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' 地址]意外鍵入堆棧。

+0

我沒有看到IL的任何錯誤。我必須猜測問題是在構造函數或XY屬性getter中。您的代碼片段很糟糕,它們缺少* new *關鍵字。 – 2010-07-05 16:31:15

+0

對不起,但用我的語言沒有新的。 float2(1.0,2.0)創建值。對於IL我爲這條指令生成一個newobj – 2010-07-05 16:34:52

回答

4

IL看起來不錯,雖然我不知道你的Float2是什麼樣子。

我發現調試這個最好的方法是將程序集保存到磁盤,然後運行peverify。任何生成AccessViolationException的代碼都會在peverify中導致錯誤。

編輯:newobj doc on MSDN談論推送一個對象引用到堆棧上,我認爲這是一個指向值類型的指針。如果你從然後peverify收到此錯誤,我認爲你需要

  1. newobj
  2. stloc給一個臨時變量
  3. ldloca獲得存儲在臨時變量
  4. 值類型的地址
  5. call

現在回想起來,這是什麼C#如果你直接調用一個像4.ToString();這樣的值類型,編譯器會這樣做。

+0

Humm好的提示,我得到 [IL]:錯誤:[偏移量0x0000000F] [找到值'Bifrost.Psl.Compiler.Runtime.Float2'] [期望值值的地址'Bifrost.Psl.Compiler.Runtime.Float2']堆棧上的意外類型。 這必須與構造函數返回的內容有關... – 2010-07-05 16:31:09

+0

請參閱我的編輯... :) – 2010-07-05 16:37:55

+0

我會嘗試很多。我會在更新後作爲答案 – 2010-07-05 21:53:00