diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/xml/DXNSIns.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/xml/DXNSIns.java index 55c807ae9..c2dae4322 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/xml/DXNSIns.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/instructions/xml/DXNSIns.java @@ -47,6 +47,7 @@ public class DXNSIns extends InstructionDefinition { @Override public void translate(boolean isStatic, int scriptIndex, int classIndex, HashMap localRegs, Stack stack, Stack scopeStack, ConstantPool constants, AVM2Instruction ins, List method_info, List output, MethodBody body, ABC abc, HashMap localRegNames, List fullyQualifiedNames, String path, HashMap localRegsAssignmentIps, int ip, HashMap> refs, AVM2Code code) { + //FIXME!!! - search namespace output.add(new DefaultXMLNamespace(ins, new StringAVM2Item(ins, constants.getString(ins.operands[0])))); } } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/DefaultXMLNamespace.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/DefaultXMLNamespace.java index d7ee97a47..f8bdaa2a9 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/DefaultXMLNamespace.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/DefaultXMLNamespace.java @@ -16,11 +16,17 @@ */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.instructions.xml.DXNSLateIns; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; /** * @@ -50,4 +56,11 @@ public class DefaultXMLNamespace extends AVM2Item { public boolean hasReturnValue() { return false; } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return toSourceMerge(localData, generator, ns, ins(new DXNSLateIns())); + } + + } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/GetDescendantsAVM2Item.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/GetDescendantsAVM2Item.java index cc06677fb..a2b41fc58 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/GetDescendantsAVM2Item.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/model/GetDescendantsAVM2Item.java @@ -16,18 +16,35 @@ */ package com.jpexs.decompiler.flash.abc.avm2.model; +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.SourceGenerator; import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; public class GetDescendantsAVM2Item extends AVM2Item { public GraphTargetItem object; - public FullMultinameAVM2Item multiname; + public GraphTargetItem multiname; + public List openedNamespaces; + public String nameStr; - public GetDescendantsAVM2Item(AVM2Instruction instruction, GraphTargetItem object, FullMultinameAVM2Item multiname) { + + //constructor for compiler + public GetDescendantsAVM2Item(GraphTargetItem object, String nameStr, List openedNamespaces) { + super(null, PRECEDENCE_PRIMARY); + this.object = object; + this.nameStr = nameStr; + this.openedNamespaces = openedNamespaces; + } + + public GetDescendantsAVM2Item(AVM2Instruction instruction, GraphTargetItem object, GraphTargetItem multiname) { super(instruction, PRECEDENCE_PRIMARY); this.object = object; this.multiname = multiname; @@ -49,4 +66,11 @@ public class GetDescendantsAVM2Item extends AVM2Item { public boolean hasReturnValue() { return true; } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return ((AVM2SourceGenerator)generator).generate(localData, this); + } + + } diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 24edde6e4..34cab0501 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -37,6 +37,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.jumps.LookupSwitchIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.GetLocal0Ins; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.KillIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.FindPropertyStrictIns; +import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetDescendantsIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetGlobalScopeIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetLexIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetScopeObjectIns; @@ -65,6 +66,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.xml.CheckFilterIns; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FloatValueAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.GetDescendantsAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; @@ -145,6 +147,18 @@ public class AVM2SourceGenerator implements SourceGenerator { return new AVM2Instruction(0, def, operands, new byte[0]); } + public List generate(SourceGeneratorLocalData localData, GetDescendantsAVM2Item item) throws CompilationException { + int nssa[] = new int[item.openedNamespaces.size()]; + for (int i = 0; i < item.openedNamespaces.size(); i++) { + nssa[i] = item.openedNamespaces.get(i); + } + int nsset = abc.constants.getNamespaceSetId(new NamespaceSet(nssa), true); + + return GraphTargetItem.toSourceMerge(localData, this, + item.object, + ins(new GetDescendantsIns(),abc.constants.getMultinameId(new Multiname(Multiname.MULTINAME, abc.constants.getStringId(item.nameStr, true), 0, nsset, 0, new ArrayList()), true)) + ); + } @Override public List generate(SourceGeneratorLocalData localData, AndItem item) throws CompilationException { List ret = new ArrayList<>(); diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java index 8a5b7da37..5d08589ef 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptLexer.java @@ -197,32 +197,32 @@ public final class ActionScriptLexer { "\1\35\1\36\1\37\1\40\1\41\2\42\1\43\1\1"+ "\1\41\2\44\1\41\1\1\1\45\1\1\1\46\1\1"+ "\1\47\2\1\1\50\1\1\1\51\2\41\2\52\1\41"+ - "\1\53\1\3\1\0\1\54\1\55\1\0\1\56\1\57"+ - "\1\60\1\61\1\62\1\63\1\64\1\65\1\66\1\67"+ - "\1\70\1\71\1\72\1\0\1\73\1\57\1\74\1\0"+ - "\2\74\7\6\1\75\1\76\2\6\1\77\16\6\1\100"+ - "\1\101\1\102\4\6\1\103\13\6\1\104\1\105\1\106"+ - "\1\107\1\110\1\111\1\112\1\113\1\114\1\115\1\116"+ - "\1\115\1\117\1\120\1\121\1\122\1\123\1\124\1\0"+ - "\1\125\1\0\1\126\1\0\1\127\1\130\1\0\1\131"+ - "\5\0\1\132\1\0\1\133\2\3\2\0\1\134\1\135"+ - "\1\136\1\137\1\140\1\0\1\57\1\141\2\142\1\74"+ - "\1\6\1\143\13\6\1\144\4\6\1\145\3\6\1\146"+ - "\6\6\1\147\12\6\1\150\1\6\1\151\1\6\1\152"+ - "\1\115\1\0\1\131\1\153\1\154\1\0\1\155\2\0"+ - "\1\156\1\157\1\0\1\160\1\142\1\74\4\6\1\161"+ - "\1\162\2\6\1\163\11\6\1\164\1\165\1\6\1\166"+ - "\11\6\1\167\5\6\1\170\1\6\1\0\1\171\1\172"+ - "\1\0\1\142\1\74\1\173\1\174\2\6\1\175\1\6"+ - "\1\176\1\177\1\6\1\200\1\6\1\201\3\6\1\202"+ - "\11\6\1\203\5\6\1\0\1\142\1\74\3\6\1\204"+ - "\1\6\1\205\1\206\2\6\1\207\3\6\1\210\3\6"+ - "\1\211\4\6\1\212\1\6\1\0\1\142\1\74\1\213"+ - "\1\6\1\214\10\6\1\215\1\216\1\6\1\217\1\220"+ - "\1\6\1\0\1\142\1\74\1\221\1\222\1\223\3\6"+ - "\1\224\3\6\1\225\1\0\1\142\1\74\1\226\1\6"+ - "\1\227\1\6\1\230\1\231\1\232\1\142\1\74\1\233"+ - "\1\234\6\74"; + "\1\53\1\3\1\0\1\54\1\55\1\56\1\57\1\60"+ + "\1\61\1\62\1\63\1\64\1\65\1\66\1\67\1\70"+ + "\1\71\1\72\1\73\1\0\1\74\1\60\1\75\1\0"+ + "\2\75\7\6\1\76\1\77\2\6\1\100\16\6\1\101"+ + "\1\102\1\103\4\6\1\104\13\6\1\105\1\106\1\107"+ + "\1\110\1\111\1\112\1\113\1\114\1\115\1\116\1\117"+ + "\1\116\1\120\1\121\1\122\1\123\1\124\1\125\1\0"+ + "\1\126\1\0\1\127\1\0\1\130\1\131\1\0\1\132"+ + "\5\0\1\133\1\0\1\134\2\3\2\0\1\135\1\136"+ + "\1\137\1\140\1\141\1\0\1\60\1\142\2\143\1\75"+ + "\1\6\1\144\13\6\1\145\4\6\1\146\3\6\1\147"+ + "\6\6\1\150\12\6\1\151\1\6\1\152\1\6\1\153"+ + "\1\116\1\0\1\132\1\154\1\155\1\0\1\156\2\0"+ + "\1\157\1\160\1\0\1\161\1\143\1\75\4\6\1\162"+ + "\1\163\2\6\1\164\11\6\1\165\1\166\1\6\1\167"+ + "\11\6\1\170\5\6\1\171\1\6\1\0\1\172\1\173"+ + "\1\0\1\143\1\75\1\174\1\175\2\6\1\176\1\6"+ + "\1\177\1\200\1\6\1\201\1\6\1\202\3\6\1\203"+ + "\11\6\1\204\5\6\1\0\1\143\1\75\3\6\1\205"+ + "\1\6\1\206\1\207\2\6\1\210\3\6\1\211\3\6"+ + "\1\212\4\6\1\213\1\6\1\0\1\143\1\75\1\214"+ + "\1\6\1\215\10\6\1\216\1\217\1\6\1\220\1\221"+ + "\1\6\1\0\1\143\1\75\1\222\1\223\1\224\3\6"+ + "\1\225\3\6\1\226\1\0\1\143\1\75\1\227\1\6"+ + "\1\230\1\6\1\231\1\232\1\233\1\143\1\75\1\234"+ + "\1\235\6\75"; private static int [] zzUnpackAction() { int [] result = new int[426]; @@ -809,7 +809,7 @@ public final class ActionScriptLexer { "\25\1\7\11\4\1\1\11\2\1\2\11\3\1\1\11"+ "\2\1\1\11\1\1\1\11\1\1\1\11\2\1\1\11"+ "\1\1\2\11\1\1\1\11\2\1\1\11\1\1\1\0"+ - "\2\11\1\0\1\11\1\1\1\11\2\1\2\11\1\1"+ + "\2\11\1\1\1\11\1\1\1\11\2\1\2\11\1\1"+ "\2\11\1\1\2\11\1\0\3\1\1\0\11\1\2\11"+ "\44\1\11\11\1\1\1\11\1\1\6\11\1\0\1\11"+ "\1\0\1\11\1\0\2\11\1\0\1\1\5\0\1\1"+ @@ -1275,151 +1275,151 @@ public final class ActionScriptLexer { case 1: { } - case 157: break; + case 158: break; case 2: { yyline++; } - case 158: break; + case 159: break; case 3: { /*ignore*/ } - case 159: break; + case 160: break; case 4: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.DIVIDE,yytext()); } - case 160: break; + case 161: break; case 5: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.MULTIPLY,yytext()); } - case 161: break; + case 162: break; case 6: { return new ParsedSymbol(SymbolGroup.IDENTIFIER,SymbolType.IDENTIFIER, yytext()); } - case 162: break; + case 163: break; case 7: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.DOT,yytext()); } - case 163: break; + case 164: break; case 8: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.LOWER_THAN,yytext()); } - case 164: break; + case 165: break; case 9: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.NOT,yytext()); } - case 165: break; + case 166: break; case 10: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.MINUS,yytext()); } - case 166: break; + case 167: break; case 11: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.GREATER_THAN,yytext()); } - case 167: break; + case 168: break; case 12: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.COLON,yytext()); } - case 168: break; + case 169: break; case 13: { return new ParsedSymbol(SymbolGroup.INTEGER,SymbolType.INTEGER,new Long(Long.parseLong((yytext())))); } - case 169: break; + case 170: break; case 14: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.TERNAR,yytext()); } - case 170: break; + case 171: break; case 15: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.BRACKET_OPEN,yytext()); } - case 171: break; + case 172: break; case 16: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.BRACKET_CLOSE,yytext()); } - case 172: break; + case 173: break; case 17: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN,yytext()); } - case 173: break; + case 174: break; case 18: { string.setLength(0); yybegin(STRING); } - case 174: break; + case 175: break; case 19: { string.setLength(0); yybegin(CHARLITERAL); } - case 175: break; + case 176: break; case 20: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.PLUS,yytext()); } - case 176: break; + case 177: break; case 21: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.PARENT_OPEN,yytext()); } - case 177: break; + case 178: break; case 22: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.PARENT_CLOSE,yytext()); } - case 178: break; + case 179: break; case 23: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.CURLY_OPEN,yytext()); } - case 179: break; + case 180: break; case 24: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.CURLY_CLOSE,yytext()); } - case 180: break; + case 181: break; case 25: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.SEMICOLON,yytext()); } - case 181: break; + case 182: break; case 26: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.COMMA,yytext()); } - case 182: break; + case 183: break; case 27: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.NEGATE,yytext()); } - case 183: break; + case 184: break; case 28: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.BITAND,yytext()); } - case 184: break; + case 185: break; case 29: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.BITOR,yytext()); } - case 185: break; + case 186: break; case 30: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.XOR,yytext()); } - case 186: break; + case 187: break; case 31: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.MODULO,yytext()); } - case 187: break; + case 188: break; case 32: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ATTRIBUTE,yytext()); } - case 188: break; + case 189: break; case 33: { string.append( yytext() ); } - case 189: break; + case 190: break; case 34: { yybegin(YYINITIAL); yyline++; } - case 190: break; + case 191: break; case 35: { yybegin(YYINITIAL); // length also includes the trailing quote return new ParsedSymbol(SymbolGroup.STRING,SymbolType.STRING,string.toString()); } - case 191: break; + case 192: break; case 36: { string.append( yytext() ); yyline++; } - case 192: break; + case 193: break; case 37: { yybegin(XML); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_STARTTAG_END, yytext())); @@ -1429,7 +1429,7 @@ public final class ActionScriptLexer { } return lex(); } - case 193: break; + case 194: break; case 38: { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_ATTRNAMEVAR_BEGIN, yytext())); @@ -1439,12 +1439,12 @@ public final class ActionScriptLexer { } return lex(); } - case 194: break; + case 195: break; case 39: { yybegin(YYINITIAL); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_ATTRVALVAR_BEGIN, yytext()); } - case 195: break; + case 196: break; case 40: { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_INSTRATTRNAMEVAR_BEGIN, yytext())); @@ -1454,16 +1454,16 @@ public final class ActionScriptLexer { } return lex(); } - case 196: break; + case 197: break; case 41: { yybegin(YYINITIAL); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_INSTRATTRVALVAR_BEGIN, yytext()); } - case 197: break; + case 198: break; case 42: { string.append(yytext()); } - case 198: break; + case 199: break; case 43: { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_VAR_BEGIN, yytext())); @@ -1473,171 +1473,175 @@ public final class ActionScriptLexer { } return lex(); } - case 199: break; + case 200: break; case 44: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_DIVIDE,yytext()); } - case 200: break; + case 201: break; case 45: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_MULTIPLY,yytext()); } - case 201: break; - case 46: - { return new ParsedSymbol(SymbolGroup.TYPENAME,SymbolType.TYPENAME,yytext()); - } case 202: break; - case 47: - { return new ParsedSymbol(SymbolGroup.DOUBLE,SymbolType.DOUBLE,new Double(Double.parseDouble((yytext())))); + case 46: + { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.DESCENDANTS,yytext()); } case 203: break; - case 48: - { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.FILTER,yytext()); + case 47: + { return new ParsedSymbol(SymbolGroup.TYPENAME,SymbolType.TYPENAME,yytext()); } case 204: break; - case 49: - { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.SHIFT_LEFT,yytext()); + case 48: + { return new ParsedSymbol(SymbolGroup.DOUBLE,SymbolType.DOUBLE,new Double(Double.parseDouble((yytext())))); } case 205: break; + case 49: + { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.FILTER,yytext()); + } + case 206: break; case 50: + { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.SHIFT_LEFT,yytext()); + } + case 207: break; + case 51: { yybegin(XMLOPENTAG); string.setLength(0); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_STARTTAG_BEGIN, yytext()); } - case 206: break; - case 51: + case 208: break; + case 52: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.LOWER_EQUAL,yytext()); } - case 207: break; - case 52: + case 209: break; + case 53: { return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_STARTVARTAG_BEGIN, yytext()); } - case 208: break; - case 53: + case 210: break; + case 54: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.NOT_EQUAL,yytext()); } - case 209: break; - case 54: + case 211: break; + case 55: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.DECREMENT,yytext()); } - case 210: break; - case 55: + case 212: break; + case 56: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_MINUS,yytext()); } - case 211: break; - case 56: + case 213: break; + case 57: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.SHIFT_RIGHT,yytext()); } - case 212: break; - case 57: + case 214: break; + case 58: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.GREATER_EQUAL,yytext()); } - case 213: break; - case 58: + case 215: break; + case 59: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.NAMESPACE_OP,yytext()); } - case 214: break; - case 59: + case 216: break; + case 60: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.EQUALS,yytext()); } - case 215: break; - case 60: + case 217: break; + case 61: { return new ParsedSymbol(SymbolGroup.INTEGER,SymbolType.INTEGER,new Long(Long.parseLong(yytext(),8))); } - case 216: break; - case 61: + case 218: break; + case 62: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_PLUS,yytext()); } - case 217: break; - case 62: + case 219: break; + case 63: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.INCREMENT,yytext()); } - case 218: break; - case 63: + case 220: break; + case 64: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.AS,yytext()); } - case 219: break; - case 64: + case 221: break; + case 65: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.IF,yytext()); } - case 220: break; - case 65: + case 222: break; + case 66: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.IS,yytext()); } - case 221: break; - case 66: + case 223: break; + case 67: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.IN,yytext()); } - case 222: break; - case 67: + case 224: break; + case 68: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.DO,yytext()); } - case 223: break; - case 68: + case 225: break; + case 69: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_BITAND,yytext()); } - case 224: break; - case 69: + case 226: break; + case 70: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.AND,yytext()); } - case 225: break; - case 70: + case 227: break; + case 71: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_BITOR,yytext()); } - case 226: break; - case 71: + case 228: break; + case 72: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.OR,yytext()); } - case 227: break; - case 72: + case 229: break; + case 73: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_XOR,yytext()); } - case 228: break; - case 73: + case 230: break; + case 74: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_MODULO,yytext()); } - case 229: break; - case 74: + case 231: break; + case 75: { throw new ParseException("Illegal escape sequence \""+yytext()+"\"",yyline+1); } - case 230: break; - case 75: + case 232: break; + case 76: { string.append( '\"' ); } - case 231: break; - case 76: + case 233: break; + case 77: { string.append( '\'' ); } - case 232: break; - case 77: + case 234: break; + case 78: { char val = (char) Integer.parseInt(yytext().substring(1),8); string.append( val ); } - case 233: break; - case 78: + case 235: break; + case 79: { string.append( '\f' ); } - case 234: break; - case 79: + case 236: break; + case 80: { string.append( '\\' ); } - case 235: break; - case 80: + case 237: break; + case 81: { string.append( '\b' ); } - case 236: break; - case 81: + case 238: break; + case 82: { string.append( '\r' ); } - case 237: break; - case 82: + case 239: break; + case 83: { string.append( '\n' ); } - case 238: break; - case 83: + case 240: break; + case 84: { string.append( '\t' ); } - case 239: break; - case 84: + case 241: break; + case 85: { yybegin(XML); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_STARTFINISHTAG_END, yytext())); if(string.length()>0){ @@ -1646,8 +1650,8 @@ public final class ActionScriptLexer { } return lex(); } - case 240: break; - case 85: + case 242: break; + case 86: { yybegin(XMLOPENTAGATTRIB); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_ATTRIBUTENAME, yytext())); if(string.length()>0){ @@ -1656,13 +1660,13 @@ public final class ActionScriptLexer { } return lex(); } - case 241: break; - case 86: + case 243: break; + case 87: { yybegin(XMLOPENTAG); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_ATTRIBUTEVALUE, yytext()); } - case 242: break; - case 87: + case 244: break; + case 88: { yybegin(XMLINSTRATTRIB); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_ATTRIBUTENAME, yytext())); if(string.length()>0){ @@ -1671,8 +1675,8 @@ public final class ActionScriptLexer { } return lex(); } - case 243: break; - case 88: + case 245: break; + case 89: { yybegin(XML); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_INSTR_END, yytext())); if(string.length()>0){ @@ -1681,13 +1685,13 @@ public final class ActionScriptLexer { } return lex(); } - case 244: break; - case 89: + case 246: break; + case 90: { yybegin(XMLINSTROPENTAG); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_ATTRIBUTEVALUE, yytext()); } - case 245: break; - case 90: + case 247: break; + case 91: { yybegin(XMLOPENTAG); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_STARTTAG_BEGIN, yytext())); if(string.length()>0){ @@ -1696,8 +1700,8 @@ public final class ActionScriptLexer { } return lex(); } - case 246: break; - case 91: + case 248: break; + case 92: { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_STARTVARTAG_BEGIN, yytext())); if(string.length()>0){ @@ -1706,84 +1710,84 @@ public final class ActionScriptLexer { } return lex(); } - case 247: break; - case 92: + case 249: break; + case 93: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.REST,yytext()); } - case 248: break; - case 93: + case 250: break; + case 94: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_SHIFT_LEFT,yytext()); } - case 249: break; - case 94: + case 251: break; + case 95: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.STRICT_NOT_EQUAL,yytext()); } - case 250: break; - case 95: + case 252: break; + case 96: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.USHIFT_RIGHT,yytext()); } - case 251: break; - case 96: + case 253: break; + case 97: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_SHIFT_RIGHT,yytext()); } - case 252: break; - case 97: + case 254: break; + case 98: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.STRICT_EQUALS,yytext()); } - case 253: break; - case 98: + case 255: break; + case 99: { return new ParsedSymbol(SymbolGroup.INTEGER,SymbolType.INTEGER,new Long(Long.parseLong(yytext().substring(2),16))); } - case 254: break; - case 99: + case 256: break; + case 100: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.FOR,yytext()); } - case 255: break; - case 100: + case 257: break; + case 101: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.SET,yytext()); } - case 256: break; - case 101: + case 258: break; + case 102: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.NEW,yytext()); } - case 257: break; - case 102: + case 259: break; + case 103: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.TRY,yytext()); } - case 258: break; - case 103: + case 260: break; + case 104: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.USE,yytext()); } - case 259: break; - case 104: + case 261: break; + case 105: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.VAR,yytext()); } - case 260: break; - case 105: + case 262: break; + case 106: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.GET,yytext()); } - case 261: break; - case 106: + case 263: break; + case 107: { return new ParsedSymbol(SymbolGroup.GLOBALCONST,SymbolType.NAN,yytext()); } - case 262: break; - case 107: + case 264: break; + case 108: { string.append(yytext()); yybegin(XML); String ret = string.toString(); string.setLength(0); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_CDATA, ret); } - case 263: break; - case 108: + case 265: break; + case 109: { string.append(yytext()); yybegin(XML); String ret = string.toString(); string.setLength(0); return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_COMMENT, ret); } - case 264: break; - case 109: + case 266: break; + case 110: { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_FINISHVARTAG_BEGIN, yytext())); if(string.length()>0){ @@ -1792,8 +1796,8 @@ public final class ActionScriptLexer { } return lex(); } - case 265: break; - case 110: + case 267: break; + case 111: { yybegin(XMLINSTROPENTAG); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_INSTR_BEGIN, yytext())); if(string.length()>0){ @@ -1802,8 +1806,8 @@ public final class ActionScriptLexer { } return lex(); } - case 266: break; - case 111: + case 268: break; + case 112: { yybegin(YYINITIAL); pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_INSTRVARTAG_BEGIN, yytext())); if(string.length()>0){ @@ -1812,44 +1816,44 @@ public final class ActionScriptLexer { } return lex(); } - case 267: break; - case 112: + case 269: break; + case 113: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.ASSIGN_USHIFT_RIGHT,yytext()); } - case 268: break; - case 113: + case 270: break; + case 114: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.EACH,yytext()); } - case 269: break; - case 114: + case 271: break; + case 115: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.ELSE,yytext()); } - case 270: break; - case 115: + case 272: break; + case 116: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.CASE,yytext()); } - case 271: break; - case 116: + case 273: break; + case 117: { return new ParsedSymbol(SymbolGroup.GLOBALCONST,SymbolType.NULL,yytext()); } - case 272: break; - case 117: + case 274: break; + case 118: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.TRUE,yytext()); } - case 273: break; - case 118: + case 275: break; + case 119: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.THIS,yytext()); } - case 274: break; - case 119: + case 276: break; + case 120: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.WITH,yytext()); } - case 275: break; - case 120: + case 277: break; + case 121: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.VOID,yytext()); } - case 276: break; - case 121: + case 278: break; + case 122: { pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_FINISHTAG, yytext())); if(string.length()>0){ pushback(new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_TEXT, string.toString())); @@ -1857,149 +1861,149 @@ public final class ActionScriptLexer { } return lex(); } - case 277: break; - case 122: + case 279: break; + case 123: { String ret=string.toString(); string.setLength(0); string.append(yytext()); yybegin(XMLCOMMENT); if(!ret.isEmpty()) return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_TEXT,ret); } - case 278: break; - case 123: + case 280: break; + case 124: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.FALSE,yytext()); } - case 279: break; - case 124: + case 281: break; + case 125: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.FINAL,yytext()); } - case 280: break; - case 125: + case 282: break; + case 126: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.BREAK,yytext()); } - case 281: break; - case 126: + case 283: break; + case 127: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.CATCH,yytext()); } - case 282: break; - case 127: + case 284: break; + case 128: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.CONST,yytext()); } - case 283: break; - case 128: + case 285: break; + case 129: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.CLASS,yytext()); } - case 284: break; - case 129: + case 286: break; + case 130: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.SUPER,yytext()); } - case 285: break; - case 130: + case 287: break; + case 131: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.THROW,yytext()); } - case 286: break; - case 131: + case 288: break; + case 132: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.WHILE,yytext()); } - case 287: break; - case 132: + case 289: break; + case 133: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.RETURN,yytext()); } - case 288: break; - case 133: + case 290: break; + case 134: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.STATIC,yytext()); } - case 289: break; - case 134: + case 291: break; + case 135: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.SWITCH,yytext()); } - case 290: break; - case 135: + case 292: break; + case 136: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.TYPEOF,yytext()); } - case 291: break; - case 136: + case 293: break; + case 137: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.IMPORT,yytext()); } - case 292: break; - case 137: + case 294: break; + case 138: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.DELETE,yytext()); } - case 293: break; - case 138: + case 295: break; + case 139: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.PUBLIC,yytext()); } - case 294: break; - case 139: + case 296: break; + case 140: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.FINALLY,yytext()); } - case 295: break; - case 140: + case 297: break; + case 141: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.EXTENDS,yytext()); } - case 296: break; - case 141: + case 298: break; + case 142: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.DEFAULT,yytext()); } - case 297: break; - case 142: + case 299: break; + case 143: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.DYNAMIC,yytext()); } - case 298: break; - case 143: + case 300: break; + case 144: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.PRIVATE,yytext()); } - case 299: break; - case 144: + case 301: break; + case 145: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.PACKAGE,yytext()); } - case 300: break; - case 145: + case 302: break; + case 146: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.FUNCTION,yytext()); } - case 301: break; - case 146: + case 303: break; + case 147: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.CONTINUE,yytext()); } - case 302: break; - case 147: + case 304: break; + case 148: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.OVERRIDE,yytext()); } - case 303: break; - case 148: + case 305: break; + case 149: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.INTERNAL,yytext()); } - case 304: break; - case 149: + case 306: break; + case 150: { return new ParsedSymbol(SymbolGroup.GLOBALCONST,SymbolType.INFINITY,yytext()); } - case 305: break; - case 150: + case 307: break; + case 151: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.NAMESPACE,yytext()); } - case 306: break; - case 151: + case 308: break; + case 152: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.INTERFACE,yytext()); } - case 307: break; - case 152: + case 309: break; + case 153: { return new ParsedSymbol(SymbolGroup.GLOBALCONST,SymbolType.UNDEFINED,yytext()); } - case 308: break; - case 153: + case 310: break; + case 154: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.PROTECTED,yytext()); } - case 309: break; - case 154: + case 311: break; + case 155: { String ret=string.toString(); string.setLength(0); string.append(yytext() ); yybegin(XMLCDATA); if(!ret.isEmpty()) return new ParsedSymbol(SymbolGroup.XML,SymbolType.XML_TEXT,ret); } - case 310: break; - case 155: + case 312: break; + case 156: { return new ParsedSymbol(SymbolGroup.OPERATOR,SymbolType.INSTANCEOF,yytext()); } - case 311: break; - case 156: + case 313: break; + case 157: { return new ParsedSymbol(SymbolGroup.KEYWORD,SymbolType.IMPLEMENTS,yytext()); } - case 312: break; + case 314: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java index 45f9ec8db..0962d9e08 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScriptParser.java @@ -24,9 +24,11 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.model.BooleanAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.ConstructSuperAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.DefaultXMLNamespace; import com.jpexs.decompiler.flash.abc.avm2.model.EscapeXAttrAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.EscapeXElemAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FloatValueAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.GetDescendantsAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item; @@ -185,7 +187,7 @@ public class ActionScriptParser { while (s.isType(SymbolType.DOT)) { s = lex(); boolean attr = false; - if(s.type == SymbolType.ATTRIBUTE){ + if (s.type == SymbolType.ATTRIBUTE) { attr = true; s = lex(); } @@ -193,11 +195,11 @@ public class ActionScriptParser { String propName = s.value.toString(); s = lex(); GraphTargetItem ns = null; - if(s.type == SymbolType.NAMESPACE_OP){ + if (s.type == SymbolType.NAMESPACE_OP) { s = lex(); expected(s, lexer.yyline(), SymbolType.IDENTIFIER); ns = new UnresolvedAVM2Item(new ArrayList(), importedClasses, false, null, lexer.yyline(), propName, null, openedNamespaces); - variables.add((UnresolvedAVM2Item)ns); + variables.add((UnresolvedAVM2Item) ns); propName = s.value.toString(); s = lex(); } @@ -208,10 +210,10 @@ public class ActionScriptParser { } else { lexer.pushback(s); } - if(ns!=null){ - ret = new NamespacedAVM2Item(index, ns, propName, ret,attr , openedNamespaces, null); - }else{ - ret = new PropertyAVM2Item(ret, (attr?"@":"")+propName, index, abc, otherABCs, openedNamespaces, new ArrayList()); + if (ns != null) { + ret = new NamespacedAVM2Item(index, ns, propName, ret, attr, openedNamespaces, null); + } else { + ret = new PropertyAVM2Item(ret, (attr ? "@" : "") + propName, index, abc, otherABCs, openedNamespaces, new ArrayList()); } s = lex(); } @@ -222,29 +224,29 @@ public class ActionScriptParser { private GraphTargetItem name(Reference needsActivation, boolean typeOnly, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables, List importedClasses) throws IOException, ParseException { ParsedSymbol s = lex(); String name = ""; - if(s.type == SymbolType.ATTRIBUTE){ + if (s.type == SymbolType.ATTRIBUTE) { name += "@"; s = lex(); } expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.THIS, SymbolType.SUPER, SymbolType.STRING_OP); - name += s.value.toString(); + name += s.value.toString(); s = lex(); - + while (s.isType(SymbolType.DOT)) { name += s.value.toString(); //. or :: s = lex(); - if(s.type == SymbolType.ATTRIBUTE){ + if (s.type == SymbolType.ATTRIBUTE) { name += "@"; s = lex(); - if(s.type == SymbolType.IDENTIFIER){ - name += s.value.toString(); - }else{ - if(s.type != SymbolType.BRACKET_OPEN){ + if (s.type == SymbolType.IDENTIFIER) { + name += s.value.toString(); + } else { + if (s.type != SymbolType.BRACKET_OPEN) { throw new ParseException("Attribute identifier or bracket expected", lexer.yyline()); } continue; } - }else{ + } else { expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.NAMESPACE); name += s.value.toString(); } @@ -252,28 +254,27 @@ public class ActionScriptParser { } String nsname = null; String nsprop = null; - if(s.type == SymbolType.NAMESPACE_OP){ - if(name.contains(".")){ - nsname = name.substring(name.lastIndexOf(".")+1); - }else{ + if (s.type == SymbolType.NAMESPACE_OP) { + if (name.contains(".")) { + nsname = name.substring(name.lastIndexOf(".") + 1); + } else { nsname = name; } s = lex(); - if(s.type == SymbolType.IDENTIFIER){ + if (s.type == SymbolType.IDENTIFIER) { nsprop = s.value.toString(); - }else{ + } else { nsprop = null; lexer.pushback(s); } - if(name.contains(".")){ - name = name.substring(0,name.lastIndexOf(".")); - }else{ + if (name.contains(".")) { + name = name.substring(0, name.lastIndexOf(".")); + } else { name = null; } s = lex(); - } - - + } + List params = new ArrayList<>(); if (s.type == SymbolType.TYPENAME) { s = lex(); @@ -303,23 +304,22 @@ public class ActionScriptParser { } else { lexer.pushback(s); } - - + GraphTargetItem ret = null; - if(name!=null){ - UnresolvedAVM2Item unr = new UnresolvedAVM2Item(params, importedClasses, typeOnly, null, lexer.yyline(), name, null, openedNamespaces); + if (name != null) { + UnresolvedAVM2Item unr = new UnresolvedAVM2Item(params, importedClasses, typeOnly, null, lexer.yyline(), name, null, openedNamespaces); unr.setIndex(index); variables.add(unr); ret = unr; } - if(nsname!=null){ - boolean attr= nsname.startsWith("@"); - if(attr){ + if (nsname != null) { + boolean attr = nsname.startsWith("@"); + if (attr) { nsname = nsname.substring(1); } - UnresolvedAVM2Item ns = new UnresolvedAVM2Item(params, importedClasses, typeOnly, null, lexer.yyline(), nsname, null, openedNamespaces); + UnresolvedAVM2Item ns = new UnresolvedAVM2Item(params, importedClasses, typeOnly, null, lexer.yyline(), nsname, null, openedNamespaces); variables.add(ns); - ret = new NamespacedAVM2Item(index, ns, nsprop, ret,attr, openedNamespaces, null); + ret = new NamespacedAVM2Item(index, ns, nsprop, ret, attr, openedNamespaces, null); } return ret; } @@ -818,21 +818,20 @@ public class ActionScriptParser { //return ret; } - private GraphTargetItem add(Object a) - { - if(a instanceof List){ - List l=(List)a; - if(l.isEmpty()){ + private GraphTargetItem add(Object a) { + if (a instanceof List) { + List l = (List) a; + if (l.isEmpty()) { return null; } GraphTargetItem o = add(l.get(0)); - for(int i=1;i rets,StringBuilder sb){ - if(sb.length()>0){ - if(!rets.isEmpty() && (rets.get(rets.size()-1) instanceof StringAVM2Item)){ - ((StringAVM2Item)rets.get(rets.size()-1)).value += sb.toString(); - }else{ + private void addS(List rets, StringBuilder sb) { + if (sb.length() > 0) { + if (!rets.isEmpty() && (rets.get(rets.size() - 1) instanceof StringAVM2Item)) { + ((StringAVM2Item) rets.get(rets.size() - 1)).value += sb.toString(); + } else { rets.add(new StringAVM2Item(null, sb.toString())); } sb.setLength(0); } } - - private List xmltag(Reference usesVars,List openedTags,Reference closedVarTags,Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, ParseException { - ParsedSymbol s = null; - List rets=new ArrayList<>(); + + private List xmltag(Reference usesVars, List openedTags, Reference closedVarTags, Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, ParseException { + ParsedSymbol s = null; + List rets = new ArrayList<>(); //GraphTargetItem ret = null; StringBuilder sb = new StringBuilder(); loop: do { s = lex(); - List sub=new ArrayList<>(); + List sub = new ArrayList<>(); Reference subclose = new Reference<>(0); - Reference subusesvars=new Reference<>(false); + Reference subusesvars = new Reference<>(false); switch (s.type) { case XML_ATTRNAMEVAR_BEGIN: //add usesVars.setVal(true); - addS(rets,sb); + addS(rets, sb); rets.add(expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); expectedType(SymbolType.CURLY_CLOSE); expectedType(SymbolType.ASSIGN); @@ -897,17 +895,17 @@ public class ActionScriptParser { lexer.yybegin(ActionScriptLexer.XMLOPENTAGATTRIB); break; case XML_ATTRVALVAR_BEGIN: //esc_xattr - usesVars.setVal(true); + usesVars.setVal(true); sb.append("\""); - addS(rets,sb); + addS(rets, sb); rets.add(new EscapeXAttrAVM2Item(null, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables))); sb.append("\""); expectedType(SymbolType.CURLY_CLOSE); lexer.yybegin(ActionScriptLexer.XMLOPENTAG); break; case XML_INSTRATTRNAMEVAR_BEGIN: //add - usesVars.setVal(true); - addS(rets,sb); + usesVars.setVal(true); + addS(rets, sb); rets.add(expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); expectedType(SymbolType.CURLY_CLOSE); expectedType(SymbolType.ASSIGN); @@ -915,64 +913,64 @@ public class ActionScriptParser { lexer.yybegin(ActionScriptLexer.XMLOPENTAGATTRIB); break; case XML_INSTRATTRVALVAR_BEGIN: //esc_xattr - usesVars.setVal(true); + usesVars.setVal(true); sb.append("\""); - addS(rets,sb); + addS(rets, sb); rets.add(new EscapeXAttrAVM2Item(null, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables))); sb.append("\""); expectedType(SymbolType.CURLY_CLOSE); lexer.yybegin(ActionScriptLexer.XMLOPENTAG); break; case XML_VAR_BEGIN: //esc_xelem - usesVars.setVal(true); - addS(rets,sb); + usesVars.setVal(true); + addS(rets, sb); rets.add(new EscapeXElemAVM2Item(null, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables))); expectedType(SymbolType.CURLY_CLOSE); lexer.yybegin(ActionScriptLexer.XML); break; case XML_FINISHVARTAG_BEGIN: //add - usesVars.setVal(true); - closedVarTags.setVal(closedVarTags.getVal()+1); + usesVars.setVal(true); + closedVarTags.setVal(closedVarTags.getVal() + 1); sb.append(""); - addS(rets,sb); + addS(rets, sb); lexer.yybegin(ActionScriptLexer.XML); break; case XML_STARTVARTAG_BEGIN: //add //openedTags.add("*"); - + //ret = add(ret, ); GraphTargetItem ex = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); expectedType(SymbolType.CURLY_CLOSE); lexer.yybegin(ActionScriptLexer.XMLOPENTAG); - sub.add("*"); + sub.add("*"); sb.append("<"); - addS(rets,sb); + addS(rets, sb); rets.add(ex); - rets.addAll(xmltag(subusesvars,sub,subclose , needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables)); - closedVarTags.setVal(subclose.getVal()+subclose.getVal()); + rets.addAll(xmltag(subusesvars, sub, subclose, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables)); + closedVarTags.setVal(subclose.getVal() + subclose.getVal()); break; case XML_INSTRVARTAG_BEGIN: //add - usesVars.setVal(true); - addS(rets,sb); + usesVars.setVal(true); + addS(rets, sb); sb.append(" st=xmltag(subusesvars,sub, closedVarTags, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables); - sb.append(s.value.toString()); - addS(rets,sb); - rets.addAll(st); - closedVarTags.setVal(subclose.getVal()+subclose.getVal()); + List st = xmltag(subusesvars, sub, closedVarTags, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables); + sb.append(s.value.toString()); + addS(rets, sb); + rets.addAll(st); + closedVarTags.setVal(subclose.getVal() + subclose.getVal()); break; /*case XML_STARTTAG_END: sb.append(s.value.toString()); @@ -1000,16 +998,15 @@ public class ActionScriptParser { break; } } while (!(openedTags.isEmpty() || closedVarTags.getVal() >= openedTags.size())); - addS(rets,sb); + addS(rets, sb); return rets; } - - - private GraphTargetItem xml(Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, ParseException { + + private GraphTargetItem xml(Reference needsActivation, List importedClasses, List openedNamespaces, HashMap registerVars, boolean inFunction, boolean inMethod, List variables) throws IOException, ParseException { List openedTags = new ArrayList<>(); int closedVarTags = 0; - - GraphTargetItem ret = add(xmltag(new Reference(false),openedTags, new Reference(closedVarTags), needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables)); + + GraphTargetItem ret = add(xmltag(new Reference(false), openedTags, new Reference(closedVarTags), needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables)); ret = new XMLAVM2Item(ret); lexer.yybegin(ActionScriptLexer.YYINITIAL); //TODO: Order of additions as in official compiler @@ -1039,427 +1036,445 @@ public class ActionScriptParser { } } - switch (s.type) { - case USE: - expectedType(SymbolType.NAMESPACE); - GraphTargetItem ns = type(needsActivation, importedClasses, openedNamespaces, variables); - openedNamespaces.add(abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE /*FIXME?*/, abc.constants.getStringId(ns.toString(), true)), 0, true)); - break; - case WITH: - needsActivation.setVal(true); - expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem wvar = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);//(name(false, openedNamespaces, registerVars, inFunction, inMethod, variables)); - if (!isNameOrProp(wvar)) { - throw new ParseException("Not a property or name", lexer.yyline()); - } - expectedType(SymbolType.PARENT_CLOSE); - expectedType(SymbolType.CURLY_OPEN); - List withVars = new ArrayList<>(); - List wcmd = commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, withVars); - variables.addAll(withVars); - for (AssignableAVM2Item a : withVars) { - if (a instanceof UnresolvedAVM2Item) { - UnresolvedAVM2Item ua = (UnresolvedAVM2Item) a; - ua.scopeStack.add(0, wvar); - } - } - expectedType(SymbolType.CURLY_CLOSE); - ret = new WithAVM2Item(null, wvar, wcmd); - ((WithAVM2Item) ret).subvariables = withVars; - break; - /*case DELETE: - GraphTargetItem varDel = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, registerVars, inFunction, inMethod, variables); - if(!isNameOrProp(varDel)){ - throw new ParseException("Not a property or name", lexer.yyline()); - } - if (varDel instanceof GetPropertyAVM2Item) { - GetPropertyAVM2Item gm = (GetPropertyAVM2Item) varDel; - ret = new DeletePropertyAVM2Item(null, gm.object, gm.propertyName); - } else if (varDel instanceof NameAVM2Item) { - variables.remove(varDel); - ret = new DeletePropertyAVM2Item(null, null, (NameAVM2Item) varDel); - } else { - throw new ParseException("Not a property", lexer.yyline()); - } - break;*/ - case FUNCTION: - s = lexer.lex(); - expected(s, lexer.yyline(), SymbolType.IDENTIFIER); - needsActivation.setVal(true); - ret = (function(needsActivation, importedClasses, 0/*?*/, TypeItem.UNBOUNDED, openedNamespaces, true, s.value.toString(), false, variables)); - break; - case VAR: - s = lex(); - expected(s, lexer.yyline(), SymbolType.IDENTIFIER); - String varIdentifier = s.value.toString(); - s = lex(); - GraphTargetItem type; - if (s.type == SymbolType.COLON) { - type = type(needsActivation, importedClasses, openedNamespaces, variables); - s = lex(); + if (s.type == SymbolType.DEFAULT) { + ParsedSymbol sx = lex(); + if (sx.type != SymbolType.IDENTIFIER) { + lexer.pushback(sx); + } else { + if (!sx.value.equals("xml")) { + lexer.pushback(sx); } else { - type = new UnboundedTypeItem(); + expectedType(SymbolType.NAMESPACE); + expectedType(SymbolType.ASSIGN); + GraphTargetItem ns = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); + ret = new DefaultXMLNamespace(null, ns); + //TODO: use dxns for attribute namespaces instead of dxnslate } - - if (s.type == SymbolType.ASSIGN) { - GraphTargetItem varval = (expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); - ret = new NameAVM2Item(type, lexer.yyline(), varIdentifier, varval, true, openedNamespaces); - variables.add((NameAVM2Item) ret); - } else { - ret = new NameAVM2Item(type, lexer.yyline(), varIdentifier, null, true, openedNamespaces); - variables.add((NameAVM2Item) ret); - lexer.pushback(s); - } - break; - case CURLY_OPEN: - ret = new BlockItem(null, commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables)); - expectedType(SymbolType.CURLY_CLOSE); - break; - /*case INCREMENT: //preincrement - case DECREMENT: //predecrement - GraphTargetItem varincdec = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, registerVars, inFunction, inMethod, variables); - if(!isNameOrProp(varincdec)){ - throw new ParseException("Not a property or name", lexer.yyline()); - } - if (s.type == SymbolType.INCREMENT) { - ret = new PreIncrementAVM2Item(null, varincdec); - } else if (s.type == SymbolType.DECREMENT) { - ret = new PreDecrementAVM2Item(null, varincdec); - } - break;*/ - case SUPER: //constructor call - ParsedSymbol ss2 = lex(); - if (ss2.type == SymbolType.PARENT_OPEN) { - List args = call(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables); - ret = new ConstructSuperAVM2Item(null, new LocalRegAVM2Item(null, 0, null), args); - } else {//no costructor call, but it could be calling parent methods... => handle in expression - lexer.pushback(ss2); - lexer.pushback(s); - } - break; - case IF: - expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem ifExpr = (expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); - expectedType(SymbolType.PARENT_CLOSE); - GraphTargetItem onTrue = command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables); - List onTrueList = new ArrayList<>(); - onTrueList.add(onTrue); - s = lex(); - List onFalseList = null; - if (s.type == SymbolType.ELSE) { - onFalseList = new ArrayList<>(); - onFalseList.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); - } else { - lexer.pushback(s); - } - ret = new IfItem(null, ifExpr, onTrueList, onFalseList); - break; - case WHILE: - expectedType(SymbolType.PARENT_OPEN); - List whileExpr = new ArrayList<>(); - whileExpr.add(commaExpression(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables)); - expectedType(SymbolType.PARENT_CLOSE); - List whileBody = new ArrayList<>(); - Loop wloop = new Loop(uniqId(), null, null); - if (loopLabel != null) { - loopLabels.put(wloop, loopLabel); - } - loops.push(wloop); - whileBody.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); - ret = new WhileItem(null, wloop, whileExpr, whileBody); - break; - case DO: - List doBody = new ArrayList<>(); - Loop dloop = new Loop(uniqId(), null, null); - loops.push(dloop); - if (loopLabel != null) { - loopLabels.put(dloop, loopLabel); - } - doBody.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); - expectedType(SymbolType.WHILE); - expectedType(SymbolType.PARENT_OPEN); - List doExpr = new ArrayList<>(); - doExpr.add(commaExpression(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables)); - expectedType(SymbolType.PARENT_CLOSE); - ret = new DoWhileItem(null, dloop, doBody, doExpr); - break; - case FOR: - s = lex(); - boolean forin = false; - boolean each = false; - GraphTargetItem collection = null; - if (s.type == SymbolType.EACH) { - each = true; - forin = true; - s = lex(); - } - expected(s, lexer.yyline(), SymbolType.PARENT_OPEN); - GraphTargetItem firstCommand = command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, false, variables); - if (firstCommand instanceof NameAVM2Item) { - NameAVM2Item nai = (NameAVM2Item) firstCommand; - if (nai.isDefinition() && nai.getAssignedValue() == null) { - firstCommand = expressionRemainder(needsActivation, openedNamespaces, firstCommand, registerVars, inFunction, inMethod, true, variables, importedClasses); + } + } + if (ret == null) { + switch (s.type) { + case USE: + expectedType(SymbolType.NAMESPACE); + GraphTargetItem ns = type(needsActivation, importedClasses, openedNamespaces, variables); + openedNamespaces.add(abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE /*FIXME?*/, abc.constants.getStringId(ns.toString(), true)), 0, true)); + break; + case WITH: + needsActivation.setVal(true); + expectedType(SymbolType.PARENT_OPEN); + GraphTargetItem wvar = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);//(name(false, openedNamespaces, registerVars, inFunction, inMethod, variables)); + if (!isNameOrProp(wvar)) { + throw new ParseException("Not a property or name", lexer.yyline()); } - } - InAVM2Item inexpr = null; - if (firstCommand instanceof InAVM2Item) { - forin = true; - inexpr = (InAVM2Item) firstCommand; - } else { - if (forin) { - throw new ParseException("In expression required", lexer.yyline()); + expectedType(SymbolType.PARENT_CLOSE); + expectedType(SymbolType.CURLY_OPEN); + List withVars = new ArrayList<>(); + List wcmd = commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, withVars); + variables.addAll(withVars); + for (AssignableAVM2Item a : withVars) { + if (a instanceof UnresolvedAVM2Item) { + UnresolvedAVM2Item ua = (UnresolvedAVM2Item) a; + ua.scopeStack.add(0, wvar); + } } - } - - Loop floop = new Loop(uniqId(), null, null); - loops.push(floop); - if (loopLabel != null) { - loopLabels.put(floop, loopLabel); - } - List forFinalCommands = new ArrayList<>(); - GraphTargetItem forExpr = null; - List forFirstCommands = new ArrayList<>(); - if (!forin) { - //GraphTargetItem firstCommand = command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables); - if (firstCommand != null) { //can be empty command - forFirstCommands.add(firstCommand); - } - forExpr = (expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); - expectedType(SymbolType.SEMICOLON); - forFinalCommands.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); - } - expectedType(SymbolType.PARENT_CLOSE); - List forBody = new ArrayList<>(); - forBody.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forin ? forinlevel + 1 : forinlevel, true, variables)); - if (forin) { - if (each) { - ret = new ForEachInAVM2Item(null, floop, inexpr, forBody); - } else { - - ret = new ForInAVM2Item(null, floop, inexpr, forBody); - } - } else { - ret = new ForItem(null, floop, forFirstCommands, forExpr, forFinalCommands, forBody); - } - break; - case SWITCH: - Loop sloop = new Loop(-uniqId(), null, null); //negative id marks switch = no continue - loops.push(sloop); - if (loopLabel != null) { - loopLabels.put(sloop, loopLabel); - } - expectedType(SymbolType.PARENT_OPEN); - GraphTargetItem switchExpr = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); - expectedType(SymbolType.PARENT_CLOSE); - expectedType(SymbolType.CURLY_OPEN); - s = lex(); - //ret.addAll(switchExpr); - int exprReg = 0; - for (int i = 0; i < 256; i++) { - if (!registerVars.containsValue(i)) { - registerVars.put("__switch" + uniqId(), i); - exprReg = i; - break; - } - } - List> caseIfs = new ArrayList<>(); - List> caseCmds = new ArrayList<>(); - List caseExprsAll = new ArrayList<>(); - List valueMapping = new ArrayList<>(); - int pos = 0; - while (s.type == SymbolType.CASE) { - List caseExprs = new ArrayList<>(); - while (s.type == SymbolType.CASE) { - GraphTargetItem curCaseExpr = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); - caseExprs.add(curCaseExpr); - expectedType(SymbolType.COLON); - s = lex(); - caseExprsAll.add(curCaseExpr); - valueMapping.add(pos); - } - pos++; - lexer.pushback(s); - List caseCmd = commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables); - caseCmds.add(caseCmd); - s = lex(); - } - List defCmd = new ArrayList<>(); - if (s.type == SymbolType.DEFAULT) { - expectedType(SymbolType.COLON); - defCmd = commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables); + expectedType(SymbolType.CURLY_CLOSE); + ret = new WithAVM2Item(null, wvar, wcmd); + ((WithAVM2Item) ret).subvariables = withVars; + break; + /*case DELETE: + GraphTargetItem varDel = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, registerVars, inFunction, inMethod, variables); + if(!isNameOrProp(varDel)){ + throw new ParseException("Not a property or name", lexer.yyline()); + } + if (varDel instanceof GetPropertyAVM2Item) { + GetPropertyAVM2Item gm = (GetPropertyAVM2Item) varDel; + ret = new DeletePropertyAVM2Item(null, gm.object, gm.propertyName); + } else if (varDel instanceof NameAVM2Item) { + variables.remove(varDel); + ret = new DeletePropertyAVM2Item(null, null, (NameAVM2Item) varDel); + } else { + throw new ParseException("Not a property", lexer.yyline()); + } + break;*/ + case FUNCTION: s = lexer.lex(); - } - expected(s, lexer.yyline(), SymbolType.CURLY_CLOSE); - ret = new SwitchItem(null, sloop, switchExpr, caseExprsAll, caseCmds, defCmd, valueMapping); - break; - case BREAK: - s = lex(); - long bloopId = 0; - if (loops.isEmpty()) { - throw new ParseException("No loop to break", lexer.yyline()); - } - if (s.type == SymbolType.IDENTIFIER) { - String breakLabel = s.value.toString(); - for (Loop l : loops) { - if (breakLabel.equals(loopLabels.get(l))) { - bloopId = l.id; + expected(s, lexer.yyline(), SymbolType.IDENTIFIER); + needsActivation.setVal(true); + ret = (function(needsActivation, importedClasses, 0/*?*/, TypeItem.UNBOUNDED, openedNamespaces, true, s.value.toString(), false, variables)); + break; + case VAR: + s = lex(); + expected(s, lexer.yyline(), SymbolType.IDENTIFIER); + String varIdentifier = s.value.toString(); + s = lex(); + GraphTargetItem type; + if (s.type == SymbolType.COLON) { + type = type(needsActivation, importedClasses, openedNamespaces, variables); + s = lex(); + } else { + type = new UnboundedTypeItem(); + } + + if (s.type == SymbolType.ASSIGN) { + GraphTargetItem varval = (expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); + ret = new NameAVM2Item(type, lexer.yyline(), varIdentifier, varval, true, openedNamespaces); + variables.add((NameAVM2Item) ret); + } else { + ret = new NameAVM2Item(type, lexer.yyline(), varIdentifier, null, true, openedNamespaces); + variables.add((NameAVM2Item) ret); + lexer.pushback(s); + } + break; + case CURLY_OPEN: + ret = new BlockItem(null, commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables)); + expectedType(SymbolType.CURLY_CLOSE); + break; + /*case INCREMENT: //preincrement + case DECREMENT: //predecrement + GraphTargetItem varincdec = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, registerVars, inFunction, inMethod, variables); + if(!isNameOrProp(varincdec)){ + throw new ParseException("Not a property or name", lexer.yyline()); + } + if (s.type == SymbolType.INCREMENT) { + ret = new PreIncrementAVM2Item(null, varincdec); + } else if (s.type == SymbolType.DECREMENT) { + ret = new PreDecrementAVM2Item(null, varincdec); + } + break;*/ + case SUPER: //constructor call + ParsedSymbol ss2 = lex(); + if (ss2.type == SymbolType.PARENT_OPEN) { + List args = call(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, variables); + ret = new ConstructSuperAVM2Item(null, new LocalRegAVM2Item(null, 0, null), args); + } else {//no costructor call, but it could be calling parent methods... => handle in expression + lexer.pushback(ss2); + lexer.pushback(s); + } + break; + case IF: + expectedType(SymbolType.PARENT_OPEN); + GraphTargetItem ifExpr = (expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); + expectedType(SymbolType.PARENT_CLOSE); + GraphTargetItem onTrue = command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables); + List onTrueList = new ArrayList<>(); + onTrueList.add(onTrue); + s = lex(); + List onFalseList = null; + if (s.type == SymbolType.ELSE) { + onFalseList = new ArrayList<>(); + onFalseList.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); + } else { + lexer.pushback(s); + } + ret = new IfItem(null, ifExpr, onTrueList, onFalseList); + break; + case WHILE: + expectedType(SymbolType.PARENT_OPEN); + List whileExpr = new ArrayList<>(); + whileExpr.add(commaExpression(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables)); + expectedType(SymbolType.PARENT_CLOSE); + List whileBody = new ArrayList<>(); + Loop wloop = new Loop(uniqId(), null, null); + if (loopLabel != null) { + loopLabels.put(wloop, loopLabel); + } + loops.push(wloop); + whileBody.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); + ret = new WhileItem(null, wloop, whileExpr, whileBody); + break; + case DO: + List doBody = new ArrayList<>(); + Loop dloop = new Loop(uniqId(), null, null); + loops.push(dloop); + if (loopLabel != null) { + loopLabels.put(dloop, loopLabel); + } + doBody.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); + expectedType(SymbolType.WHILE); + expectedType(SymbolType.PARENT_OPEN); + List doExpr = new ArrayList<>(); + doExpr.add(commaExpression(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables)); + expectedType(SymbolType.PARENT_CLOSE); + ret = new DoWhileItem(null, dloop, doBody, doExpr); + break; + case FOR: + s = lex(); + boolean forin = false; + boolean each = false; + GraphTargetItem collection = null; + if (s.type == SymbolType.EACH) { + each = true; + forin = true; + s = lex(); + } + expected(s, lexer.yyline(), SymbolType.PARENT_OPEN); + GraphTargetItem firstCommand = command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, false, variables); + if (firstCommand instanceof NameAVM2Item) { + NameAVM2Item nai = (NameAVM2Item) firstCommand; + if (nai.isDefinition() && nai.getAssignedValue() == null) { + firstCommand = expressionRemainder(needsActivation, openedNamespaces, firstCommand, registerVars, inFunction, inMethod, true, variables, importedClasses); + } + } + InAVM2Item inexpr = null; + if (firstCommand instanceof InAVM2Item) { + forin = true; + inexpr = (InAVM2Item) firstCommand; + } else { + if (forin) { + throw new ParseException("In expression required", lexer.yyline()); + } + } + + Loop floop = new Loop(uniqId(), null, null); + loops.push(floop); + if (loopLabel != null) { + loopLabels.put(floop, loopLabel); + } + List forFinalCommands = new ArrayList<>(); + GraphTargetItem forExpr = null; + List forFirstCommands = new ArrayList<>(); + if (!forin) { + //GraphTargetItem firstCommand = command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables); + if (firstCommand != null) { //can be empty command + forFirstCommands.add(firstCommand); + } + forExpr = (expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); + expectedType(SymbolType.SEMICOLON); + forFinalCommands.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); + } + expectedType(SymbolType.PARENT_CLOSE); + List forBody = new ArrayList<>(); + forBody.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forin ? forinlevel + 1 : forinlevel, true, variables)); + if (forin) { + if (each) { + ret = new ForEachInAVM2Item(null, floop, inexpr, forBody); + } else { + + ret = new ForInAVM2Item(null, floop, inexpr, forBody); + } + } else { + ret = new ForItem(null, floop, forFirstCommands, forExpr, forFinalCommands, forBody); + } + break; + case SWITCH: + Loop sloop = new Loop(-uniqId(), null, null); //negative id marks switch = no continue + loops.push(sloop); + if (loopLabel != null) { + loopLabels.put(sloop, loopLabel); + } + expectedType(SymbolType.PARENT_OPEN); + GraphTargetItem switchExpr = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); + expectedType(SymbolType.PARENT_CLOSE); + expectedType(SymbolType.CURLY_OPEN); + s = lex(); + //ret.addAll(switchExpr); + int exprReg = 0; + for (int i = 0; i < 256; i++) { + if (!registerVars.containsValue(i)) { + registerVars.put("__switch" + uniqId(), i); + exprReg = i; break; } } - if (bloopId == 0) { - throw new ParseException("Identifier of loop expected", lexer.yyline()); - } - } else { - lexer.pushback(s); - bloopId = loops.peek().id; - } - ret = new BreakItem(null, bloopId); - break; - case CONTINUE: - s = lex(); - long cloopId = 0; - if (loops.isEmpty()) { - throw new ParseException("No loop to continue", lexer.yyline()); - } - if (s.type == SymbolType.IDENTIFIER) { - String continueLabel = s.value.toString(); - for (Loop l : loops) { - if (l.id < 0) { //negative id marks switch => no continue - continue; + List> caseIfs = new ArrayList<>(); + List> caseCmds = new ArrayList<>(); + List caseExprsAll = new ArrayList<>(); + List valueMapping = new ArrayList<>(); + int pos = 0; + while (s.type == SymbolType.CASE) { + List caseExprs = new ArrayList<>(); + while (s.type == SymbolType.CASE) { + GraphTargetItem curCaseExpr = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); + caseExprs.add(curCaseExpr); + expectedType(SymbolType.COLON); + s = lex(); + caseExprsAll.add(curCaseExpr); + valueMapping.add(pos); } - if (continueLabel.equals(loopLabels.get(l))) { - cloopId = l.id; - break; + pos++; + lexer.pushback(s); + List caseCmd = commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables); + caseCmds.add(caseCmd); + s = lex(); + } + List defCmd = new ArrayList<>(); + if (s.type == SymbolType.DEFAULT) { + expectedType(SymbolType.COLON); + defCmd = commands(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables); + s = lexer.lex(); + } + expected(s, lexer.yyline(), SymbolType.CURLY_CLOSE); + ret = new SwitchItem(null, sloop, switchExpr, caseExprsAll, caseCmds, defCmd, valueMapping); + break; + case BREAK: + s = lex(); + long bloopId = 0; + if (loops.isEmpty()) { + throw new ParseException("No loop to break", lexer.yyline()); + } + if (s.type == SymbolType.IDENTIFIER) { + String breakLabel = s.value.toString(); + for (Loop l : loops) { + if (breakLabel.equals(loopLabels.get(l))) { + bloopId = l.id; + break; + } } - } - if (cloopId == -1) { - throw new ParseException("Identifier of loop expected", lexer.yyline()); - } - } else { - lexer.pushback(s); - for (int i = loops.size() - 1; i >= 0; i--) { - if (loops.get(i).id >= 0) {//no switches - cloopId = loops.peek().id; - break; + if (bloopId == 0) { + throw new ParseException("Identifier of loop expected", lexer.yyline()); } + } else { + lexer.pushback(s); + bloopId = loops.peek().id; } - if (cloopId <= 0) { + ret = new BreakItem(null, bloopId); + break; + case CONTINUE: + s = lex(); + long cloopId = 0; + if (loops.isEmpty()) { throw new ParseException("No loop to continue", lexer.yyline()); } - } - //TODO: handle switch - ret = new ContinueItem(null, cloopId); - break; - case RETURN: - GraphTargetItem retexpr = expression(needsActivation, importedClasses, openedNamespaces, true, registerVars, inFunction, inMethod, true, variables); - if (retexpr == null) { - ret = new ReturnVoidAVM2Item(null); - } else { - ret = new ReturnValueAVM2Item(null, retexpr); - } - break; - case TRY: - needsActivation.setVal(true); - List tryCommands = new ArrayList<>(); - tryCommands.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); - s = lex(); - boolean found = false; - List> catchCommands = new ArrayList<>(); - List catchExceptions = new ArrayList<>(); - int varCnt = variables.size(); - List> catchesVars = new ArrayList<>(); - while (s.type == SymbolType.CATCH) { - expectedType(SymbolType.PARENT_OPEN); - s = lex(); - expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.THIS, SymbolType.SUPER, SymbolType.STRING_OP); - - String enamestr = s.value.toString(); - expectedType(SymbolType.COLON); - GraphTargetItem etype = type(needsActivation, importedClasses, openedNamespaces, variables); - NameAVM2Item e = new NameAVM2Item(etype, lexer.yyline(), enamestr, new ExceptionAVM2Item(null)/*?*/, true/*?*/, openedNamespaces); - variables.add(e); - catchExceptions.add(e); - e.setSlotNumber(1); - e.setSlotScope(Integer.MAX_VALUE); //will be changed later - expectedType(SymbolType.PARENT_CLOSE); - List cc = new ArrayList<>(); - List catchVars = new ArrayList<>(); - cc.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, catchVars)); - catchesVars.add(catchVars); - variables.addAll(catchVars); - - for (AssignableAVM2Item a : catchVars) { - if (a instanceof UnresolvedAVM2Item) { - UnresolvedAVM2Item ui = (UnresolvedAVM2Item) a; - if (ui.getVariableName().equals(e.getVariableName())) { - try { - ui.resolve(new ArrayList(), new ArrayList(), abc, otherABCs, new ArrayList(), variables); - } catch (CompilationException ex) { - //ignore - } - ui.setSlotNumber(e.getSlotNumber()); - ui.setSlotScope(e.getSlotScope()); + if (s.type == SymbolType.IDENTIFIER) { + String continueLabel = s.value.toString(); + for (Loop l : loops) { + if (l.id < 0) { //negative id marks switch => no continue + continue; } - - } - } - - catchCommands.add(cc); - s = lex(); - found = true; - } - //TODO: - for (int i = varCnt; i < variables.size(); i++) { - AssignableAVM2Item av = variables.get(i); - if (av instanceof UnresolvedAVM2Item) { - UnresolvedAVM2Item ui = (UnresolvedAVM2Item) av; - for (NameAVM2Item e : catchExceptions) { - if (ui.getVariableName().equals(e.getVariableName())) { - try { - ui.resolve(new ArrayList(), new ArrayList(), abc, otherABCs, new ArrayList(), variables); - } catch (CompilationException ex) { - //ignore - } - ui.setSlotNumber(e.getSlotNumber()); - ui.setSlotScope(e.getSlotScope()); + if (continueLabel.equals(loopLabels.get(l))) { + cloopId = l.id; + break; } } + if (cloopId == -1) { + throw new ParseException("Identifier of loop expected", lexer.yyline()); + } + } else { + lexer.pushback(s); + for (int i = loops.size() - 1; i >= 0; i--) { + if (loops.get(i).id >= 0) {//no switches + cloopId = loops.peek().id; + break; + } + } + if (cloopId <= 0) { + throw new ParseException("No loop to continue", lexer.yyline()); + } } - } - - List finallyCommands = null; - if (s.type == SymbolType.FINALLY) { - finallyCommands = new ArrayList<>(); - finallyCommands.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); - found = true; - s = lex(); - } - if (!found) { - expected(s, lexer.yyline(), SymbolType.CATCH, SymbolType.FINALLY); - } - lexer.pushback(s); - TryAVM2Item tai = new TryAVM2Item(tryCommands, null, catchCommands, finallyCommands); - tai.catchVariables = catchesVars; - tai.catchExceptions2 = catchExceptions; - ret = tai; - break; - case THROW: - ret = new ThrowAVM2Item(null, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); - break; - default: - GraphTargetItem valcmd = expressionCommands(s, registerVars, inFunction, inMethod, forinlevel, variables); - if (valcmd != null) { - ret = valcmd; + //TODO: handle switch + ret = new ContinueItem(null, cloopId); break; - } - if (s.type == SymbolType.SEMICOLON) { - return null; - } - lexer.pushback(s); - ret = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); - if (debugMode) { - System.out.println("/command"); - } + case RETURN: + GraphTargetItem retexpr = expression(needsActivation, importedClasses, openedNamespaces, true, registerVars, inFunction, inMethod, true, variables); + if (retexpr == null) { + ret = new ReturnVoidAVM2Item(null); + } else { + ret = new ReturnValueAVM2Item(null, retexpr); + } + break; + case TRY: + needsActivation.setVal(true); + List tryCommands = new ArrayList<>(); + tryCommands.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); + s = lex(); + boolean found = false; + List> catchCommands = new ArrayList<>(); + List catchExceptions = new ArrayList<>(); + int varCnt = variables.size(); + List> catchesVars = new ArrayList<>(); + while (s.type == SymbolType.CATCH) { + expectedType(SymbolType.PARENT_OPEN); + s = lex(); + expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.THIS, SymbolType.SUPER, SymbolType.STRING_OP); + + String enamestr = s.value.toString(); + expectedType(SymbolType.COLON); + GraphTargetItem etype = type(needsActivation, importedClasses, openedNamespaces, variables); + NameAVM2Item e = new NameAVM2Item(etype, lexer.yyline(), enamestr, new ExceptionAVM2Item(null)/*?*/, true/*?*/, openedNamespaces); + variables.add(e); + catchExceptions.add(e); + e.setSlotNumber(1); + e.setSlotScope(Integer.MAX_VALUE); //will be changed later + expectedType(SymbolType.PARENT_CLOSE); + List cc = new ArrayList<>(); + List catchVars = new ArrayList<>(); + cc.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, catchVars)); + catchesVars.add(catchVars); + variables.addAll(catchVars); + + for (AssignableAVM2Item a : catchVars) { + if (a instanceof UnresolvedAVM2Item) { + UnresolvedAVM2Item ui = (UnresolvedAVM2Item) a; + if (ui.getVariableName().equals(e.getVariableName())) { + try { + ui.resolve(new ArrayList(), new ArrayList(), abc, otherABCs, new ArrayList(), variables); + } catch (CompilationException ex) { + //ignore + } + ui.setSlotNumber(e.getSlotNumber()); + ui.setSlotScope(e.getSlotScope()); + } + + } + } + + catchCommands.add(cc); + s = lex(); + found = true; + } + //TODO: + for (int i = varCnt; i < variables.size(); i++) { + AssignableAVM2Item av = variables.get(i); + if (av instanceof UnresolvedAVM2Item) { + UnresolvedAVM2Item ui = (UnresolvedAVM2Item) av; + for (NameAVM2Item e : catchExceptions) { + if (ui.getVariableName().equals(e.getVariableName())) { + try { + ui.resolve(new ArrayList(), new ArrayList(), abc, otherABCs, new ArrayList(), variables); + } catch (CompilationException ex) { + //ignore + } + ui.setSlotNumber(e.getSlotNumber()); + ui.setSlotScope(e.getSlotScope()); + } + } + } + } + + List finallyCommands = null; + if (s.type == SymbolType.FINALLY) { + finallyCommands = new ArrayList<>(); + finallyCommands.add(command(needsActivation, importedClasses, openedNamespaces, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, true, variables)); + found = true; + s = lex(); + } + if (!found) { + expected(s, lexer.yyline(), SymbolType.CATCH, SymbolType.FINALLY); + } + lexer.pushback(s); + TryAVM2Item tai = new TryAVM2Item(tryCommands, null, catchCommands, finallyCommands); + tai.catchVariables = catchesVars; + tai.catchExceptions2 = catchExceptions; + ret = tai; + break; + case THROW: + ret = new ThrowAVM2Item(null, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); + break; + default: + GraphTargetItem valcmd = expressionCommands(s, registerVars, inFunction, inMethod, forinlevel, variables); + if (valcmd != null) { + ret = valcmd; + break; + } + if (s.type == SymbolType.SEMICOLON) { + return null; + } + lexer.pushback(s); + ret = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); + if (debugMode) { + System.out.println("/command"); + } + } } if (debugMode) { System.out.println("/command"); @@ -1504,34 +1519,40 @@ public class ActionScriptParser { GraphTargetItem ret = null; ParsedSymbol s = lex(); switch (s.type) { + case DESCENDANTS: + ParsedSymbol d = lex(); + expected(d, lexer.yyline(), SymbolType.IDENTIFIER); + ret = new GetDescendantsAVM2Item(expr, d.value.toString(), openedNamespaces); + allowRemainder = true; + break; case FILTER: needsActivation.setVal(true); - ret = new XMLFilterAVM2Item(expr,expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables), openedNamespaces); + ret = new XMLFilterAVM2Item(expr, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables), openedNamespaces); expectedType(SymbolType.PARENT_CLOSE); allowRemainder = true; break; /*case NAMESPACE_OP: - s = lex(); - if (s.type == SymbolType.BRACKET_OPEN) { - GraphTargetItem index = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); - NameAVM2Item name = new NameAVM2Item(new UnboundedTypeItem(), lexer.yyline(), null, null, false, openedNamespaces); - name.setIndex(index); - name.setNs(expr); - ret = name; - expectedType(SymbolType.BRACKET_CLOSE); - } else { - lexer.pushback(s); - GraphTargetItem name = name(needsActivation, false, openedNamespaces, registerVars, inFunction, inMethod, variables, importedClasses); - if (name instanceof UnresolvedAVM2Item) { - ((UnresolvedAVM2Item) name).setNs(expr); - //((UnresolvedAVM2Item) name).unresolved = false; - //TODO - } else { - throw new ParseException("Not a property name", lexer.yyline()); - } - ret = name; - } - break;*/ + s = lex(); + if (s.type == SymbolType.BRACKET_OPEN) { + GraphTargetItem index = expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables); + NameAVM2Item name = new NameAVM2Item(new UnboundedTypeItem(), lexer.yyline(), null, null, false, openedNamespaces); + name.setIndex(index); + name.setNs(expr); + ret = name; + expectedType(SymbolType.BRACKET_CLOSE); + } else { + lexer.pushback(s); + GraphTargetItem name = name(needsActivation, false, openedNamespaces, registerVars, inFunction, inMethod, variables, importedClasses); + if (name instanceof UnresolvedAVM2Item) { + ((UnresolvedAVM2Item) name).setNs(expr); + //((UnresolvedAVM2Item) name).unresolved = false; + //TODO + } else { + throw new ParseException("Not a property name", lexer.yyline()); + } + ret = name; + } + break;*/ case IN: ret = new InAVM2Item(null, expr, expression(needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, true, variables)); break; diff --git a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java index 8d4c8efd4..df2cb4386 100644 --- a/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java +++ b/trunk/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/SymbolType.java @@ -201,5 +201,6 @@ public enum SymbolType { XML_INSTRATTRNAMEVAR_BEGIN, // {...}= XML_INSTRATTRVALVAR_BEGIN, // aaa={ XML_INSTRVARTAG_BEGIN, //