do not copy big byte arrays, store only references (ByteArrayRange) e.g in image tags

This commit is contained in:
2014-11-09 22:40:36 +01:00
parent 270cc40856
commit 3456d04d38
151 changed files with 2787 additions and 2512 deletions
@@ -1712,17 +1712,16 @@ public class AVM2Code implements Cloneable {
}
}
}
/*
//undeclare registers at the end of the block?
for(int reg:nowdeclaredRegs){
declaredRegisters[reg] = false;
}
//undeclare registers at the end of the block?
for(int reg:nowdeclaredRegs){
declaredRegisters[reg] = false;
}
for(Slot s:nowdeclaredSlots){
declaredSlots.remove(s);
}*/
for(Slot s:nowdeclaredSlots){
declaredSlots.remove(s);
}*/
}
public List<GraphTargetItem> toGraphTargetItems(String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, AVM2ConstantPool constants, List<MethodInfo> method_info, MethodBody body, HashMap<Integer, String> localRegNames, ScopeStack scopeStack, boolean isStaticInitializer, List<String> fullyQualifiedNames, Traits initTraits, int staticOperation, HashMap<Integer, Integer> localRegAssigmentIps, HashMap<Integer, List<Integer>> refs) throws InterruptedException {
@@ -667,7 +667,7 @@ public class AVM2Graph extends Graph {
WhileItem w = (WhileItem) loopItem;
if ((!w.expression.isEmpty()) && (w.expression.get(w.expression.size() - 1) instanceof HasNextAVM2Item)) {
HasNextAVM2Item hn=(HasNextAVM2Item)w.expression.get(w.expression.size() - 1);
HasNextAVM2Item hn = (HasNextAVM2Item) w.expression.get(w.expression.size() - 1);
if (((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection != null) {
if (((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection.getNotCoerced().getThroughRegister() instanceof FilteredCheckAVM2Item) {
//GraphTargetItem gti = ((HasNextAVM2Item) ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1))).collection.getNotCoerced().getThroughRegister();
@@ -704,7 +704,7 @@ public class AVM2Graph extends Graph {
if (gti instanceof NextValueAVM2Item) {
return new ForEachInAVM2Item(w.src, w.loop, new InAVM2Item(hn.instruction, sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection), w.commands);
} else if (gti instanceof NextNameAVM2Item) {
return new ForInAVM2Item(w.src, w.loop, new InAVM2Item(hn.instruction,sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection), w.commands);
return new ForInAVM2Item(w.src, w.loop, new InAVM2Item(hn.instruction, sti.getObject(), ((HasNextAVM2Item) w.expression.get(w.expression.size() - 1)).collection), w.commands);
}
}
}
@@ -41,10 +41,10 @@ public abstract class GetLocalTypeIns extends InstructionDefinition {
@Override
public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap<Integer, GraphTargetItem> localRegs, TranslateStack stack, ScopeStack scopeStack, AVM2ConstantPool constants, AVM2Instruction ins, List<MethodInfo> method_info, List<GraphTargetItem> output, MethodBody body, ABC abc, HashMap<Integer, String> localRegNames, List<String> fullyQualifiedNames, String path, HashMap<Integer, Integer> regAssignCount, int ip, HashMap<Integer, List<Integer>> refs, AVM2Code code) {
int regId = getRegisterId(ins);
if(regId == 0){
if (regId == 0) {
if ((classIndex >= abc.instance_info.size()) || classIndex < 0) {
stack.push(new ScriptAVM2Item(scriptIndex));
return;
@@ -56,7 +56,7 @@ public abstract class GetLocalTypeIns extends InstructionDefinition {
}
return;
}
GraphTargetItem computedValue = localRegs.get(regId);
int assignCount = 0;
if (regAssignCount.containsKey(regId)) {
@@ -40,8 +40,8 @@ public abstract class AVM2Item extends GraphTargetItem {
public AVM2Item(GraphSourceItem instruction, int precedence) {
super(instruction, precedence);
if(instruction instanceof AVM2Instruction){
this.instruction = (AVM2Instruction)instruction;
if (instruction instanceof AVM2Instruction) {
this.instruction = (AVM2Instruction) instruction;
}
}
@@ -81,11 +81,11 @@ public abstract class AVM2Item extends GraphTargetItem {
}
}
}
if (empty) {
return propertyName.toString(writer, localData);
}
if (propertyName instanceof FullMultinameAVM2Item) {
if (propertyName instanceof FullMultinameAVM2Item) {
if (((FullMultinameAVM2Item) propertyName).name != null) {
return propertyName.toString(writer, localData);
} else {
@@ -101,7 +101,7 @@ public abstract class AVM2Item extends GraphTargetItem {
public static String localRegName(HashMap<Integer, String> localRegNames, int reg) {
if (localRegNames.containsKey(reg)) {
return IdentifiersDeobfuscation.printIdentifier(true,localRegNames.get(reg));
return IdentifiersDeobfuscation.printIdentifier(true, localRegNames.get(reg));
} else {
if (reg == 0) {
return "this";
@@ -18,7 +18,6 @@ package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.decompiler.flash.abc.types.Multiname;
import com.jpexs.decompiler.flash.abc.types.Namespace;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.GraphTargetItem;
@@ -26,14 +25,13 @@ import com.jpexs.decompiler.graph.TypeItem;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FullMultinameAVM2Item extends AVM2Item {
public int multinameIndex;
public GraphTargetItem name;
public GraphTargetItem namespace;
public FullMultinameAVM2Item(AVM2Instruction instruction, int multinameIndex, GraphTargetItem name) {
super(instruction, PRECEDENCE_PRIMARY);
this.multinameIndex = multinameIndex;
@@ -155,10 +153,10 @@ public class FullMultinameAVM2Item extends AVM2Item {
return false;
}
return true;
}
}
@Override
public GraphTargetItem returnType() {
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@@ -34,9 +34,9 @@ public class GetLexAVM2Item extends AVM2Item {
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
String localName = propertyName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false);
srcData.put("localName",localName);
String localName = propertyName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false);
srcData.put("localName", localName);
return writer.append(propertyName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false));
}
@@ -40,21 +40,21 @@ public class GetSlotAVM2Item extends AVM2Item {
return writer.append("/*UnknownSlot*/");
}
srcData.put("localName", getNameAsStr(localData));
return writer.append(slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false));
}
public String getNameAsStr(LocalData localData){
public String getNameAsStr(LocalData localData) {
return slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false);
}
public GraphTextWriter getName(GraphTextWriter writer, LocalData localData) {
public GraphTextWriter getName(GraphTextWriter writer, LocalData localData) {
if (slotName == null) {
return writer.append("/*UnknownSlot*/");
}
return writer.append(slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
@@ -55,7 +55,7 @@ public class LocalRegAVM2Item extends AVM2Item {
computedResult = null;
}
}
this.computedValue = computedValue;
this.computedValue = computedValue;
}
@Override
@@ -61,7 +61,7 @@ public class NewFunctionAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
MethodBody body = abc.findBody(methodIndex);
writer.append("function");
writer.startMethod(methodIndex);
writer.startMethod(methodIndex);
writer.append((!functionName.isEmpty() ? " " + functionName : ""));
writer.appendNoHilight("(");
methodInfo.get(methodIndex).getParamStr(writer, constants, body, abc, fullyQualifiedNames);
@@ -71,7 +71,7 @@ public class NewFunctionAVM2Item extends AVM2Item {
writer.appendNoHilight(abc.findBodyIndex(methodIndex));
writer.newLine();
}
methodInfo.get(methodIndex).getReturnTypeStr(writer, constants, fullyQualifiedNames);
methodInfo.get(methodIndex).getReturnTypeStr(writer, constants, fullyQualifiedNames);
writer.startBlock();
if (body != null) {
if (writer instanceof NulWriter) {
@@ -42,7 +42,7 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
public SetLocalAVM2Item(AVM2Instruction instruction, int regIndex, GraphTargetItem value) {
super(instruction, PRECEDENCE_ASSIGMENT);
this.regIndex = regIndex;
this.value = value;
this.value = value;
}
@Override
@@ -35,7 +35,7 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
super(instruction, PRECEDENCE_ASSIGMENT);
this.slotName = slotName;
this.value = value;
this.scope = scope;
this.scope = scope;
}
@Override
@@ -51,11 +51,11 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
return value.toString(writer, localData);
}
public String getNameAsStr(LocalData localData){
public String getNameAsStr(LocalData localData) {
return slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames, false);
}
public GraphTextWriter getName(GraphTextWriter writer, LocalData localData) {
public GraphTextWriter getName(GraphTextWriter writer, LocalData localData) {
if (slotName == null) {
return writer.append("/*UnknownSlot*/");
}
@@ -33,7 +33,7 @@ public class ThisAVM2Item extends AVM2Item {
public Multiname className;
public ThisAVM2Item(GraphSourceItem instruction,Multiname className) {
public ThisAVM2Item(GraphSourceItem instruction, Multiname className) {
super(instruction, PRECEDENCE_PRIMARY);
this.className = className;
srcData.put("localName", "this");
@@ -45,7 +45,7 @@ public class ThisAVM2Item extends AVM2Item {
}
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("this");
}
@@ -16,7 +16,6 @@
*/
package com.jpexs.decompiler.flash.abc.avm2.model.clauses;
import com.jpexs.decompiler.flash.abc.ABC;
import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item;
@@ -24,13 +23,10 @@ import com.jpexs.decompiler.flash.abc.avm2.model.GetSlotAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetSlotAVM2Item;
import com.jpexs.decompiler.flash.abc.types.InstanceInfo;
import com.jpexs.decompiler.flash.abc.types.Multiname;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TypeItem;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.ArrayList;
/**
*
@@ -49,38 +45,38 @@ public class DeclarationAVM2Item extends AVM2Item {
public DeclarationAVM2Item(GraphTargetItem assignment) {
this(assignment, null);
}
}
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if(assignment instanceof LocalRegAVM2Item){ //for..in
LocalRegAVM2Item lti=(LocalRegAVM2Item)assignment;
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
if (assignment instanceof LocalRegAVM2Item) { //for..in
LocalRegAVM2Item lti = (LocalRegAVM2Item) assignment;
String localName = localRegName(localData.localRegNames, lti.regIndex);
srcData.put("localName",localName);
srcData.put("localName", localName);
srcData.put("declaration", "true");
srcData.put("declaredType", "*");
writer.append("var ");
writer.append(localName);
return writer;
}
if(assignment instanceof GetSlotAVM2Item){ //for..in
GetSlotAVM2Item sti=(GetSlotAVM2Item)assignment;
srcData.put("localName",sti.getNameAsStr(localData));
if (assignment instanceof GetSlotAVM2Item) { //for..in
GetSlotAVM2Item sti = (GetSlotAVM2Item) assignment;
srcData.put("localName", sti.getNameAsStr(localData));
srcData.put("declaration", "true");
srcData.put("declaredType", "*");
writer.append("var ");
sti.getName(writer, localData);
return writer;
}
if (assignment instanceof SetLocalAVM2Item) {
if (assignment instanceof SetLocalAVM2Item) {
SetLocalAVM2Item lti = (SetLocalAVM2Item) assignment;
String localName = localRegName(localData.localRegNames, lti.regIndex);
srcData.put("localName",localName);
srcData.put("localName", localName);
srcData.put("declaration", "true");
GraphTargetItem coerType = TypeItem.UNBOUNDED;
if (lti.value instanceof CoerceAVM2Item) {
coerType = ((CoerceAVM2Item) lti.value).typeObj;
@@ -88,23 +84,23 @@ public class DeclarationAVM2Item extends AVM2Item {
if (lti.value instanceof ConvertAVM2Item) {
coerType = ((ConvertAVM2Item) lti.value).type;
}
srcData.put("declaredType", (coerType instanceof TypeItem)?((TypeItem)coerType).fullTypeName:"*");
srcData.put("declaredType", (coerType instanceof TypeItem) ? ((TypeItem) coerType).fullTypeName : "*");
writer.append("var ");
writer.append(localName);
writer.append(":");
writer.append(":");
coerType.appendTo(writer, localData);
writer.append(" = ");
return lti.value.toString(writer, localData);
}
if (assignment instanceof SetSlotAVM2Item) {
SetSlotAVM2Item ssti = (SetSlotAVM2Item) assignment;
srcData.put("localName",ssti.getNameAsStr(localData));
srcData.put("localName", ssti.getNameAsStr(localData));
srcData.put("declaration", "true");
srcData.put("declaredType", (type instanceof TypeItem)?((TypeItem)type).fullTypeName:"*");
srcData.put("declaredType", (type instanceof TypeItem) ? ((TypeItem) type).fullTypeName : "*");
writer.append("var ");
ssti.getName(writer, localData);
writer.append(":");
writer.append(":");
type.appendTo(writer, localData);
writer.append(" = ");
return ssti.value.toString(writer, localData);
@@ -79,16 +79,16 @@ public class TryAVM2Item extends AVM2Item implements Block {
writer.newLine();
writer.append("catch(");
String localName = catchExceptions.get(e).getVarName(localData.constantsAvm2, localData.fullyQualifiedNames);
Map<String,String> data=new HashMap<>();
Map<String, String> data = new HashMap<>();
data.put("localName", localName);
data.put("declaration", "true");
int eti= catchExceptions.get(e).type_index;
data.put("declaredType", eti<=0?"*":localData.constantsAvm2.constant_multiname.get(eti).getNameWithNamespace(localData.constantsAvm2, true));
writer.hilightSpecial(localName, "try.name",e,data);
int eti = catchExceptions.get(e).type_index;
data.put("declaredType", eti <= 0 ? "*" : localData.constantsAvm2.constant_multiname.get(eti).getNameWithNamespace(localData.constantsAvm2, true));
writer.hilightSpecial(localName, "try.name", e, data);
writer.append(":");
writer.hilightSpecial(catchExceptions.get(e).getTypeName(localData.constantsAvm2, localData.fullyQualifiedNames),"try.type",e);
writer.hilightSpecial(catchExceptions.get(e).getTypeName(localData.constantsAvm2, localData.fullyQualifiedNames), "try.type", e);
writer.append(")");
writer.startBlock();
List<GraphTargetItem> commands = catchCommands.get(e);
@@ -350,7 +350,7 @@ public class ActionScriptParser {
name = null;
}
s = lex();
}
}
GraphTargetItem ret = null;
if (name != null) {
@@ -53,11 +53,11 @@ public class InstanceInfo {
return "name_index=" + abc.constants.getMultiname(name_index).toString(abc.constants, fullyQualifiedNames) + " super_index=" + supIndexStr + " flags=" + flags + " protectedNS=" + protectedNS + " interfaces=" + Helper.intArrToString(interfaces) + " method_index=" + iinit_index + "\r\n" + instance_traits.toString(abc, fullyQualifiedNames);
}
public GraphTextWriter getClassHeaderStr(GraphTextWriter writer,ABC abc, List<String> fullyQualifiedNames, boolean allowPrivate) {
public GraphTextWriter getClassHeaderStr(GraphTextWriter writer, ABC abc, List<String> fullyQualifiedNames, boolean allowPrivate) {
String modifiers;
Namespace ns = abc.constants.getMultiname(name_index).getNamespace(abc.constants);
modifiers = ns.getPrefix(abc);
if(!allowPrivate && modifiers.equals("private")){
if (!allowPrivate && modifiers.equals("private")) {
modifiers = "";
}
if (!modifiers.isEmpty()) {
@@ -74,16 +74,14 @@ public class InstanceInfo {
if (isInterface()) {
objType = "interface ";
}
writer.appendNoHilight(modifiers + objType);
writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc.constants, new ArrayList<String>()/* No full names here*/, false),"classname");
writer.hilightSpecial(abc.constants.getMultiname(name_index).getName(abc.constants, new ArrayList<String>()/* No full names here*/, false), "classname");
if (super_index > 0) {
String typeName = abc.constants.getMultiname(super_index).getNameWithNamespace(abc.constants, true);
writer.appendNoHilight(" extends ");
writer.hilightSpecial(abc.constants.getMultiname(super_index).getName(abc.constants, fullyQualifiedNames, false),"typename",typeName);
writer.hilightSpecial(abc.constants.getMultiname(super_index).getName(abc.constants, fullyQualifiedNames, false), "typename", typeName);
}
if (interfaces.length > 0) {
if (isInterface()) {
@@ -96,10 +94,10 @@ public class InstanceInfo {
writer.append(", ");
}
String typeName = abc.constants.getMultiname(interfaces[i]).getNameWithNamespace(abc.constants, true);
writer.hilightSpecial(abc.constants.getMultiname(interfaces[i]).getName(abc.constants, fullyQualifiedNames, false),"typename",typeName);
writer.hilightSpecial(abc.constants.getMultiname(interfaces[i]).getName(abc.constants, fullyQualifiedNames, false), "typename", typeName);
}
}
return writer;
}
@@ -269,33 +269,32 @@ public class MethodInfo {
public GraphTextWriter getParamStr(GraphTextWriter writer, AVM2ConstantPool constants, MethodBody body, ABC abc, List<String> fullyQualifiedNames) {
Map<Integer, String> localRegNames = new HashMap<>();
if (body != null && Configuration.getLocalNamesFromDebugInfo.get()) {
localRegNames = body.getCode().getLocalRegNamesFromDebug(abc);
if (body != null && Configuration.getLocalNamesFromDebugInfo.get()) {
localRegNames = body.getCode().getLocalRegNamesFromDebug(abc);
}
Map<String,String> pdata;
Map<String, String> pdata;
for (int i = 0; i < param_types.length; i++) {
if (i > 0) {
writer.appendNoHilight(", ");
}
String ptype = "*";
if (param_types[i] > 0) {
ptype = constants.getMultiname(param_types[i]).getNameWithNamespace(constants,false);
ptype = constants.getMultiname(param_types[i]).getNameWithNamespace(constants, false);
}
pdata=new HashMap<>();
pdata.put("declaration", "true");
pdata = new HashMap<>();
pdata.put("declaration", "true");
pdata.put("declaredType", ptype);
if (!localRegNames.isEmpty()) {
pdata.put("localName", localRegNames.get(i + 1)); //assuming it is a slot
writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(true,localRegNames.get(i + 1)),"paramname",i,pdata);
writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(true, localRegNames.get(i + 1)), "paramname", i, pdata);
} else if ((paramNames.length > i) && (paramNames[i] != 0) && Configuration.paramNamesEnable.get()) {
pdata.put("localName", constants.getString(paramNames[i]));
writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(true,constants.getString(paramNames[i])),"paramname",i,pdata);
pdata.put("localName", constants.getString(paramNames[i]));
writer.hilightSpecial(IdentifiersDeobfuscation.printIdentifier(true, constants.getString(paramNames[i])), "paramname", i, pdata);
} else {
pdata.put("localName","param"+(i+1));
writer.hilightSpecial("param" + (i + 1),"paramname",i,pdata);
pdata.put("localName", "param" + (i + 1));
writer.hilightSpecial("param" + (i + 1), "paramname", i, pdata);
}
writer.appendNoHilight(":");
if (param_types[i] == 0) {
@@ -323,21 +322,21 @@ public class MethodInfo {
} else {
restName = "rest";
}
pdata=new HashMap<>();
pdata = new HashMap<>();
pdata.put("declaration", "true");
pdata.put("declaredType", "*");
pdata.put("localName",restName);
pdata.put("localName", restName);
writer.append(restAdd);
writer.hilightSpecial(restName, "flag.NEED_REST",0,pdata);
writer.hilightSpecial(restName, "flag.NEED_REST", 0, pdata);
}
return writer;
}
public GraphTextWriter getReturnTypeStr(GraphTextWriter writer, AVM2ConstantPool constants, List<String> fullyQualifiedNames) {
String rname = "*";
if(ret_type>0){
rname = IdentifiersDeobfuscation.printIdentifier(true,constants.getMultiname(ret_type).getName(constants, fullyQualifiedNames, true),"void");
}
if (ret_type > 0) {
rname = IdentifiersDeobfuscation.printIdentifier(true, constants.getMultiname(ret_type).getName(constants, fullyQualifiedNames, true), "void");
}
return writer.hilightSpecial(rname, "returns");
}
@@ -264,7 +264,7 @@ public class Multiname {
if ((fullyQualifiedNames != null) && fullyQualifiedNames.contains(name)) {
return getNameWithNamespace(constants, raw);
}
return (isAttribute() ? "@" : "") + (raw ? name : IdentifiersDeobfuscation.printIdentifier(true,name));
return (isAttribute() ? "@" : "") + (raw ? name : IdentifiersDeobfuscation.printIdentifier(true, name));
}
}
@@ -104,7 +104,7 @@ public class Namespace {
if (raw) {
return constants.getString(name_index);
}
return IdentifiersDeobfuscation.printNamespace(true,constants.getString(name_index));
return IdentifiersDeobfuscation.printNamespace(true, constants.getString(name_index));
}
public boolean hasName(String name, AVM2ConstantPool constants) {
@@ -348,7 +348,7 @@ public class TraitClass extends Trait implements TraitWithSlot {
@Override
public GraphTextWriter toStringHeader(Trait parent, String path, List<ABCContainerTag> abcTags, ABC abc, boolean isStatic, ScriptExportMode exportMode, int scriptIndex, int classIndex, GraphTextWriter writer, List<String> fullyQualifiedNames, boolean parallel) {
abc.instance_info.get(class_info).getClassHeaderStr(writer,abc, fullyQualifiedNames,false);
abc.instance_info.get(class_info).getClassHeaderStr(writer, abc, fullyQualifiedNames, false);
return writer;
}
@@ -447,7 +447,7 @@ public class TraitClass extends Trait implements TraitWithSlot {
}
//class header
abc.instance_info.get(class_info).getClassHeaderStr(writer,abc, fullyQualifiedNames,false);
abc.instance_info.get(class_info).getClassHeaderStr(writer, abc, fullyQualifiedNames, false);
writer.startBlock();
int bodyIndex = abc.findBodyIndex(abc.class_info.get(class_info).cinit_index);