diff --git a/trunk/src/com/jpexs/asdec/abc/ABC.java b/trunk/src/com/jpexs/asdec/abc/ABC.java index 420d3c230..0f5a8bf64 100644 --- a/trunk/src/com/jpexs/asdec/abc/ABC.java +++ b/trunk/src/com/jpexs/asdec/abc/ABC.java @@ -889,4 +889,10 @@ public class ABC { } return ret; } + + public void autoFillAllBodyParams(){ + for(int i=0;i getLocalRegNamesFromDebug(ABC abc){ return true; } - public CodeStats getStats(ABC abc) + public CodeStats getStats(ABC abc,MethodBody body) { CodeStats stats=new CodeStats(this); if(!walkCode(stats,0,0,0,abc)){ return null; } + for(ABCException ex:body.exceptions){ + try { + int exStart=adr2pos(ex.start); + if(!walkCode(stats, adr2pos(ex.target), stats.instructionStats[exStart].stackpos, stats.instructionStats[exStart].scopepos, abc)){ + return null; + } + } catch (ConvertException ex1) { + + } + } return stats; } } diff --git a/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java b/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java index a533845a2..2628d66da 100644 --- a/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java +++ b/trunk/src/com/jpexs/asdec/abc/gui/MethodBodyParamsPanel.java @@ -20,6 +20,7 @@ package com.jpexs.asdec.abc.gui; import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.avm2.CodeStats; import com.jpexs.asdec.abc.types.MethodBody; +import java.awt.Color; import java.awt.Dimension; import java.text.NumberFormat; import javax.swing.JCheckBox; @@ -47,7 +48,7 @@ public class MethodBodyParamsPanel extends JPanel implements ChangeListener{ public JFormattedTextField maxScopeDepthField = new JFormattedTextField(NumberFormat.getNumberInstance()); public MethodBody body; public JCheckBox autoFillCheckBox=new JCheckBox("Auto fill on code save (GLOBAL SETTING)"); - + public JLabel experimentalLabel=new JLabel("...EXPERIMENTAL"); public MethodBodyParamsPanel() { setLayout(null); @@ -71,10 +72,14 @@ public class MethodBodyParamsPanel extends JPanel implements ChangeListener{ add(maxScopeDepthLabel); add(maxScopeDepthField); - autoFillCheckBox.setBounds(50, 10+30+30+30+30, 250, 25); + autoFillCheckBox.setBounds(30, 10+30+30+30+30, 230, 25); add(autoFillCheckBox); autoFillCheckBox.addChangeListener(this); + experimentalLabel.setForeground(Color.red); + experimentalLabel.setBounds(250,10+30+30+30+30, 100, 25); + add(experimentalLabel); + setPreferredSize(new Dimension(300,150)); } @@ -101,16 +106,10 @@ public class MethodBodyParamsPanel extends JPanel implements ChangeListener{ body.max_stack = Integer.parseInt(maxStackField.getText()); body.max_regs = Integer.parseInt(localCountField.getText()); body.max_scope_depth = Integer.parseInt(maxScopeDepthField.getText()); - }else{ - CodeStats stats=body.code.getStats(Main.abcMainFrame.abc); - if(stats==null) + }else{ + if(!body.autoFillStats(Main.abcMainFrame.abc)) { JOptionPane.showMessageDialog(null, "Cannot get code stats for automatic body params.\r\nUncheck autofill to avoid this message.","Warning",JOptionPane.WARNING_MESSAGE); - }else{ - System.out.println(stats.toString(Main.abcMainFrame.abc)); - /*body.max_stack=stats.maxstack; - body.max_scope_depth=body.init_scope_depth+stats.maxscope; - body.max_regs=stats.maxlocal;*/ } } return true; diff --git a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java index 62edf60ed..41c1c5adc 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java +++ b/trunk/src/com/jpexs/asdec/abc/types/MethodBody.java @@ -21,6 +21,7 @@ package com.jpexs.asdec.abc.types; import com.jpexs.asdec.Main; import com.jpexs.asdec.abc.ABC; import com.jpexs.asdec.abc.avm2.AVM2Code; +import com.jpexs.asdec.abc.avm2.CodeStats; import com.jpexs.asdec.abc.avm2.ConstantPool; import com.jpexs.asdec.abc.avm2.instructions.InstructionDefinition; import com.jpexs.asdec.abc.types.traits.Traits; @@ -119,5 +120,19 @@ public class MethodBody implements Cloneable { return ret; } + public boolean autoFillStats(ABC abc) + { + CodeStats stats=code.getStats(abc,this); + if(stats==null){ + return false; + } + max_stack=stats.maxstack; + max_scope_depth=init_scope_depth+stats.maxscope; + max_regs=stats.maxlocal; + abc.method_info[method_info].setFlagSetsdxns(stats.has_set_dxns); + abc.method_info[method_info].setFlagNeed_activation(stats.has_activation); + return true; + } + } diff --git a/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java b/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java index cc25ae2bd..45644f9a9 100644 --- a/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java +++ b/trunk/src/com/jpexs/asdec/abc/types/MethodInfo.java @@ -35,6 +35,48 @@ public class MethodInfo { public ValueKind optional[]; public int paramNames[]; + public void setFlagSetsdxns() + { + flags|=64; + } + + public void setFlagSetsdxns(boolean val) + { + if(val){ + setFlagSetsdxns(); + }else{ + unsetFlagSetsdxns(); + } + } + + public void unsetFlagSetsdxns() + { + if(flagSetsdxns()){ + flags-=64; + } + } + + public void setFlagNeed_activation() + { + flags|=2; + } + + public void setFlagNeed_activation(boolean val) + { + if(val){ + setFlagNeed_activation(); + }else{ + unsetFlagNeed_activation(); + } + } + + public void unsetFlagNeed_activation() + { + if(flagNeed_activation()){ + flags-=2; + } + } + public void setFlagNeed_rest() { flags|=4; @@ -47,6 +89,15 @@ public class MethodInfo { } } + public void setFlagNeed_rest(boolean val) + { + if(val){ + setFlagNeed_rest(); + }else{ + unsetFlagNeed_rest(); + } + } + public void setFlagHas_optional() { flags|=8; @@ -59,6 +110,15 @@ public class MethodInfo { } } + public void setFlagHas_optional(boolean val) + { + if(val){ + setFlagHas_optional(); + }else{ + unsetFlagHas_optional(); + } + } + public void setFlagHas_paramnames() { flags|=128; @@ -71,6 +131,15 @@ public class MethodInfo { } } + public void setFlagHas_paramnames(boolean val) + { + if(val){ + setFlagHas_paramnames(); + }else{ + unsetFlagHas_paramnames(); + } + } + public boolean flagNeed_arguments() { return (flags & 1) == 1; } diff --git a/trunk/src/com/jpexs/asdec/tags/DoABCTag.java b/trunk/src/com/jpexs/asdec/tags/DoABCTag.java index b29d4466e..a98750425 100644 --- a/trunk/src/com/jpexs/asdec/tags/DoABCTag.java +++ b/trunk/src/com/jpexs/asdec/tags/DoABCTag.java @@ -88,7 +88,7 @@ public class DoABCTag extends Tag { * @return Bytes of data */ @Override - public byte[] getData(int version) { + public byte[] getData(int version) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); OutputStream os = bos;