2011-01-08 120 views
0

我正在生成Java代碼,然後將被編譯並加載回來。我的問題是,我基本上需要跳轉,因爲當我從函數返回時,我希望從點繼續執行在我已經離開的環路中。希望這裏的代碼能夠說明我的願望。雖然實際的代碼也會有一些ifs,並且會更深入。生成Java源代碼和跳轉

MyIter a,b,c; 

boolean func() { 
jump to correct state here 

state0: 

a = ...; 
while (a.next()) { 
    state1: while (b.next()) { 
    return true; // start again at state1 
    } 
    b = ...; 
} 

c = ...; 
state2: 
while (c.next()) { 
    return true; // start again at state2 
} 
return false; 
} 

在C我可能會使用跳轉表和狀態變量。性能是關鍵,代碼與Java應用程序交互。

我最好的猜測,到目前爲止已經:

  • 翻轉循環和邏輯的嵌套。這變得太麻煩和有問題。
  • 添加邏輯以允許流回到原來的位置,但這可能很麻煩。
  • 我認爲字節碼可以跳,所以我可以生成字節碼自己,但似乎並不理想(是對此有任何好的圖書館?)
  • 延續傳遞風格來避免返回,但會涉及到重大重組,但目前可能的路要走。

我想知道如果有人有任何想法?

+1

我想你就會有一個硬的時間做跳躍,即使在字節碼 - 驗證有各種的規則使得字節碼比你想像的要靈活得多。 – 2011-01-08 21:17:32

回答

2

最簡單的方法是使用一個開關塊(或如果你有,嵌套switch語句)

enum State { 
    state1, state2, state3; 
} 

State state = State.state1; 

public boolean func() { 
    while(true) { 
    switch(state) { 
     case state1: 
      if(test()) return true; 
      state = state2; 
      break; 
     case state2: 
      if(test2()) return false; 
      state = state3; 
      break; 
     case state3: 
      if(test3()) return true; 
      state = state1; 
      break; 
     } 
    } 
} 
+0

謝謝。玩完之後再思考一下,這對於我的目的看起來是最好的選擇。一個快速實施運行良好,但不幸的是它會有時嵌套。 – Molehill 2011-01-09 03:23:23