2011-01-08 110 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