На Java это написано так... когда я портировал этот код... понял, что нет таких вещей, как break <label>
и continue <label>
.
Я знаю, что эти команды не были включены, потому что ДОЛЖЕН быть более чистый способ сделать это при использовании goto с командой.
Но в итоге я использовал... приведенный ниже код С#, чтобы переписать его чище?
Код Java
for(JClass c : classes) {
for(JMethod m : c.getMethods()) {
JCode code = m.getCode();
if(code == null)
continue;
label: for(int index = 0; index < code.getExceptionLookupTable().length; index++) {
JException e = code.getExceptionTable().get(index);
for(int index2 = e.getStartIndex(); index2 < e.getEndIndex(); index2++)
if(code.getInstruction(index2).getOpcode() == NEW && ((NEW) code.getInstruction(index2)).getType().equals("java/lang/RuntimeException"))
continue label;
if(e.getCatchTypeClassName().equals("java/lang/RuntimeException")) {
for(int index = e.getHandlerIndex(); index < code.getInstrLength(); index++) {
JInstruction instr = code.getInstruction(index);
if(instr.getOpcode() == ATHROW)
break;
else if(instr instanceof ReturnInstruction)
break label;
}
removeStuff(code, ei--);
}
}
}
}
Код C#.
foreach(JClass c in classes) {
foreach(JMethod m in c.getMethods()) {
JCode code = m.getCode();
if(code == null)
continue;
for(int index = 0; index < code.getExceptionTable().Length; index++) {
bool continueELoop = false;
bool breakELoop = false;
JException e = code.getExceptionTable().get(index);
for(int index2 = e.getStartIndex(); index2 < e.getEndIndex(); index2++) {
if(code.getInstruction(index2).getOpcode() == JInstructions.NEW && ((NEW) code.getInstruction(index2)).getType().Equals("java/lang/RuntimeException")) {
continueELoop = true;
break;
}
}
if(continueELoop) continue;
if(e.getCatchTypeClassName().Equals("java/lang/RuntimeException")) {
for(int index = e.getHandlerIndex(); index < code.getInstrLength(); index++) {
JInstruction instr = code.getInstruction(index);
if (instr.getOpcode() == JInstructions.ATHROW) {
break;
} else if (isReturnInstruction(instr)) {
breakELoop = true;
break;
}
}
removeStuff(code, ei--);
}
if (breakELoop) break;
}
}
}
Вы можете видеть, глядя на версию Java, а затем глядя на портированную версию C#... ощущение чистоты уходит. Допустил ли я какие-то ошибки, из-за которых код стал короче? или красивее? Спасибо за помощь.
break label
отличается от GOTO? - person Cameron   schedule 20.07.2011continue <label>
иbreak<label>
. Если нет способа сделатьcontinue label
с помощью goto, я его изменю. - person SSpoke   schedule 20.07.2011break label
может переходить только к меткам родительских блоков, а метки можно прикреплять только к блокам.break label
предназначен для облегчения вложенного взлома. - person Mark Elliot   schedule 20.07.2011