Replace NodeModifier by ElementModifier

This commit is contained in:
Alexey Andreev 2016-08-20 13:52:01 +03:00
parent 1be9ffb19e
commit 7679d12888
8 changed files with 37 additions and 90 deletions

View File

@ -19,15 +19,12 @@ import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import org.teavm.model.ElementModifier;
/**
*
* @author Alexey Andreev
*/
public class ClassNode {
private String name;
private String parentName;
private Set<NodeModifier> modifiers = EnumSet.noneOf(NodeModifier.class);
private Set<ElementModifier> modifiers = EnumSet.noneOf(ElementModifier.class);
private List<FieldNode> fields = new ArrayList<>();
private List<MethodNode> methods = new ArrayList<>();
private List<String> interfaces = new ArrayList<>();
@ -57,7 +54,7 @@ public class ClassNode {
return interfaces;
}
public Set<NodeModifier> getModifiers() {
public Set<ElementModifier> getModifiers() {
return modifiers;
}
}

View File

@ -17,16 +17,13 @@ package org.teavm.ast;
import java.util.EnumSet;
import java.util.Set;
import org.teavm.model.ElementModifier;
import org.teavm.model.ValueType;
/**
*
* @author Alexey Andreev
*/
public class FieldNode {
private String name;
private ValueType type;
private Set<NodeModifier> modifiers = EnumSet.noneOf(NodeModifier.class);
private Set<ElementModifier> modifiers = EnumSet.noneOf(ElementModifier.class);
private Object initialValue;
public FieldNode(String name, ValueType type) {
@ -38,7 +35,7 @@ public class FieldNode {
return name;
}
public Set<NodeModifier> getModifiers() {
public Set<ElementModifier> getModifiers() {
return modifiers;
}

View File

@ -18,11 +18,12 @@ package org.teavm.ast;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import org.teavm.model.ElementModifier;
import org.teavm.model.MethodReference;
public abstract class MethodNode {
private MethodReference reference;
private Set<NodeModifier> modifiers = EnumSet.noneOf(NodeModifier.class);
private Set<ElementModifier> modifiers = EnumSet.noneOf(ElementModifier.class);
public MethodNode(MethodReference reference) {
this.reference = reference;
@ -33,7 +34,7 @@ public abstract class MethodNode {
return reference;
}
public Set<NodeModifier> getModifiers() {
public Set<ElementModifier> getModifiers() {
return modifiers;
}

View File

@ -1,27 +0,0 @@
/*
* Copyright 2016 Alexey Andreev.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.teavm.ast;
/**
*
* @author Alexey Andreev
*/
public enum NodeModifier {
STATIC,
INTERFACE,
ENUM,
SYNCHRONIZED
}

View File

@ -21,7 +21,6 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Deque;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@ -37,7 +36,6 @@ import org.teavm.ast.GotoPartStatement;
import org.teavm.ast.IdentifiedStatement;
import org.teavm.ast.MethodNode;
import org.teavm.ast.NativeMethodNode;
import org.teavm.ast.NodeModifier;
import org.teavm.ast.RegularMethodNode;
import org.teavm.ast.SequentialStatement;
import org.teavm.ast.Statement;
@ -61,10 +59,10 @@ import org.teavm.model.ClassHolderSource;
import org.teavm.model.ElementModifier;
import org.teavm.model.FieldHolder;
import org.teavm.model.Instruction;
import org.teavm.model.TextLocation;
import org.teavm.model.MethodHolder;
import org.teavm.model.MethodReference;
import org.teavm.model.Program;
import org.teavm.model.TextLocation;
import org.teavm.model.TryCatchBlock;
import org.teavm.model.ValueType;
import org.teavm.model.Variable;
@ -193,7 +191,7 @@ public class Decompiler {
ClassNode clsNode = new ClassNode(cls.getName(), cls.getParent());
for (FieldHolder field : cls.getFields()) {
FieldNode fieldNode = new FieldNode(field.getName(), field.getType());
fieldNode.getModifiers().addAll(mapModifiers(field.getModifiers()));
fieldNode.getModifiers().addAll(field.getModifiers());
fieldNode.setInitialValue(field.getInitialValue());
clsNode.getFields().add(fieldNode);
}
@ -209,7 +207,7 @@ public class Decompiler {
clsNode.getMethods().add(methodNode);
}
clsNode.getInterfaces().addAll(cls.getInterfaces());
clsNode.getModifiers().addAll(mapModifiers(cls.getModifiers()));
clsNode.getModifiers().addAll(cls.getModifiers());
return clsNode;
}
@ -238,7 +236,7 @@ public class Decompiler {
}
NativeMethodNode methodNode = new NativeMethodNode(new MethodReference(method.getOwnerName(),
method.getDescriptor()));
methodNode.getModifiers().addAll(mapModifiers(method.getModifiers()));
methodNode.getModifiers().addAll(method.getModifiers());
methodNode.setGenerator(generator);
methodNode.setAsync(asyncMethods.contains(method.getReference()));
return methodNode;
@ -278,7 +276,7 @@ public class Decompiler {
Optimizer optimizer = new Optimizer();
optimizer.optimize(methodNode, method.getProgram());
methodNode.getModifiers().addAll(mapModifiers(method.getModifiers()));
methodNode.getModifiers().addAll(method.getModifiers());
int paramCount = Math.min(method.getSignature().length, program.variableCount());
for (int i = 0; i < paramCount; ++i) {
Variable var = program.variableAt(i);
@ -345,7 +343,7 @@ public class Decompiler {
Optimizer optimizer = new Optimizer();
optimizer.optimize(node, splitter);
node.getModifiers().addAll(mapModifiers(method.getModifiers()));
node.getModifiers().addAll(method.getModifiers());
int paramCount = Math.min(method.getSignature().length, program.variableCount());
for (int i = 0; i < paramCount; ++i) {
Variable var = program.variableAt(i);
@ -555,23 +553,6 @@ public class Decompiler {
}
}
private Set<NodeModifier> mapModifiers(Set<ElementModifier> modifiers) {
Set<NodeModifier> result = EnumSet.noneOf(NodeModifier.class);
if (modifiers.contains(ElementModifier.STATIC)) {
result.add(NodeModifier.STATIC);
}
if (modifiers.contains(ElementModifier.INTERFACE)) {
result.add(NodeModifier.INTERFACE);
}
if (modifiers.contains(ElementModifier.ENUM)) {
result.add(NodeModifier.ENUM);
}
if (modifiers.contains(ElementModifier.SYNCHRONIZED)) {
result.add(NodeModifier.SYNCHRONIZED);
}
return result;
}
private List<Block> createBlocks(int start) {
List<Block> result = new ArrayList<>();
while (currentNode != null && currentNode.getStart() == start) {

View File

@ -51,7 +51,6 @@ import org.teavm.ast.MonitorExitStatement;
import org.teavm.ast.NewArrayExpr;
import org.teavm.ast.NewExpr;
import org.teavm.ast.NewMultiArrayExpr;
import org.teavm.ast.NodeModifier;
import org.teavm.ast.OperationType;
import org.teavm.ast.PrimitiveCastExpr;
import org.teavm.ast.QualificationExpr;
@ -71,6 +70,7 @@ import org.teavm.ast.UnwrapArrayExpr;
import org.teavm.ast.VariableExpr;
import org.teavm.ast.VariableNode;
import org.teavm.ast.WhileStatement;
import org.teavm.model.ElementModifier;
import org.teavm.model.FieldReference;
import org.teavm.model.MethodDescriptor;
import org.teavm.model.MethodReference;
@ -80,7 +80,7 @@ import org.teavm.model.instructions.ArrayElementType;
import org.teavm.model.util.VariableType;
public class AstIO {
private static final NodeModifier[] nodeModifiers = NodeModifier.values();
private static final ElementModifier[] nodeModifiers = ElementModifier.values();
private static final BinaryOperation[] binaryOperations = BinaryOperation.values();
private static final UnaryOperation[] unaryOperations = UnaryOperation.values();
private static final ArrayElementType[] arrayElementTypes = ArrayElementType.values();
@ -196,16 +196,16 @@ public class AstIO {
}
}
private int packModifiers(Set<NodeModifier> modifiers) {
private int packModifiers(Set<ElementModifier> modifiers) {
int packed = 0;
for (NodeModifier modifier : modifiers) {
for (ElementModifier modifier : modifiers) {
packed |= 1 << modifier.ordinal();
}
return packed;
}
private Set<NodeModifier> unpackModifiers(int packed) {
EnumSet<NodeModifier> modifiers = EnumSet.noneOf(NodeModifier.class);
private Set<ElementModifier> unpackModifiers(int packed) {
EnumSet<ElementModifier> modifiers = EnumSet.noneOf(ElementModifier.class);
while (packed != 0) {
int shift = Integer.numberOfTrailingZeros(packed);
modifiers.add(nodeModifiers[shift]);

View File

@ -44,7 +44,6 @@ import org.teavm.ast.NativeMethodNode;
import org.teavm.ast.NewArrayExpr;
import org.teavm.ast.NewExpr;
import org.teavm.ast.NewMultiArrayExpr;
import org.teavm.ast.NodeModifier;
import org.teavm.ast.PrimitiveCastExpr;
import org.teavm.ast.QualificationExpr;
import org.teavm.ast.RegularMethodNode;
@ -100,7 +99,7 @@ class NameFrequencyEstimator implements StatementVisitor, ExprVisitor, MethodNod
}
for (FieldNode field : cls.getFields()) {
consumer.consume(new FieldReference(cls.getName(), field.getName()));
if (field.getModifiers().contains(NodeModifier.STATIC)) {
if (field.getModifiers().contains(ElementModifier.STATIC)) {
consumer.consume(cls.getName());
}
}
@ -113,11 +112,11 @@ class NameFrequencyEstimator implements StatementVisitor, ExprVisitor, MethodNod
if (asyncFamilyMethods.contains(method.getReference())) {
consumer.consume(method.getReference());
}
if (clinit != null && (method.getModifiers().contains(NodeModifier.STATIC)
if (clinit != null && (method.getModifiers().contains(ElementModifier.STATIC)
|| method.getReference().getName().equals("<init>"))) {
consumer.consume(method.getReference());
}
if (!method.getModifiers().contains(NodeModifier.STATIC)) {
if (!method.getModifiers().contains(ElementModifier.STATIC)) {
consumer.consume(method.getReference().getDescriptor());
consumer.consume(method.getReference());
}

View File

@ -57,7 +57,6 @@ import org.teavm.ast.NativeMethodNode;
import org.teavm.ast.NewArrayExpr;
import org.teavm.ast.NewExpr;
import org.teavm.ast.NewMultiArrayExpr;
import org.teavm.ast.NodeModifier;
import org.teavm.ast.OperationType;
import org.teavm.ast.PrimitiveCastExpr;
import org.teavm.ast.QualificationExpr;
@ -382,7 +381,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
List<FieldNode> nonStaticFields = new ArrayList<>();
List<FieldNode> staticFields = new ArrayList<>();
for (FieldNode field : cls.getFields()) {
if (field.getModifiers().contains(NodeModifier.STATIC)) {
if (field.getModifiers().contains(ElementModifier.STATIC)) {
staticFields.add(field);
} else {
nonStaticFields.add(field);
@ -443,7 +442,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
boolean needsClinit = clinit != null;
List<MethodNode> clinitMethods = new ArrayList<>();
for (MethodNode method : cls.getMethods()) {
if (needsClinit && (method.getModifiers().contains(NodeModifier.STATIC)
if (needsClinit && (method.getModifiers().contains(ElementModifier.STATIC)
|| method.getReference().getName().equals("<init>"))) {
clinitMethods.add(method);
} else {
@ -463,10 +462,10 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
.append("();").softNewLine();
writer.outdent().append("}").newLine();
}
if (!cls.getModifiers().contains(NodeModifier.INTERFACE)) {
if (!cls.getModifiers().contains(ElementModifier.INTERFACE)) {
for (MethodNode method : cls.getMethods()) {
cls.getMethods();
if (!method.getModifiers().contains(NodeModifier.STATIC)) {
if (!method.getModifiers().contains(ElementModifier.STATIC)) {
if (method.getReference().getName().equals("<init>")) {
renderInitializer(method);
}
@ -512,7 +511,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
}
writer.append("],").ws();
int flags = 0;
if (cls.getModifiers().contains(NodeModifier.ENUM)) {
if (cls.getModifiers().contains(ElementModifier.ENUM)) {
flags |= 1;
}
writer.append(flags).append(',').ws();
@ -528,11 +527,11 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
List<String> stubNames = new ArrayList<>();
List<MethodNode> virtualMethods = new ArrayList<>();
for (MethodNode method : cls.getMethods()) {
if (clinit != null && (method.getModifiers().contains(NodeModifier.STATIC)
if (clinit != null && (method.getModifiers().contains(ElementModifier.STATIC)
|| method.getReference().getName().equals("<init>"))) {
stubNames.add(naming.getFullNameFor(method.getReference()));
}
if (!method.getModifiers().contains(NodeModifier.STATIC)) {
if (!method.getModifiers().contains(ElementModifier.STATIC)) {
virtualMethods.add(method);
}
}
@ -665,7 +664,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append("function ").append(name).append("(");
}
int startParam = 0;
if (method.getModifiers().contains(NodeModifier.STATIC)) {
if (method.getModifiers().contains(ElementModifier.STATIC)) {
startParam = 1;
}
for (int i = startParam; i <= ref.parameterCount(); ++i) {
@ -784,7 +783,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
}
int firstToSave = 0;
if (methodNode.getModifiers().contains(NodeModifier.STATIC)) {
if (methodNode.getModifiers().contains(ElementModifier.STATIC)) {
firstToSave = 1;
}
@ -804,7 +803,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.softNewLine();
writer.outdent().append("}").softNewLine();
if (methodNode.getModifiers().contains(NodeModifier.SYNCHRONIZED)) {
if (methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) {
writer.append("try").ws().append('{').indent().softNewLine();
}
writer.append(mainLoopName()).append(":").ws().append("while").ws().append("(true)")
@ -813,7 +812,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
.append('{').softNewLine();
for (int i = 0; i < methodNode.getBody().size(); ++i) {
writer.append("case ").append(i).append(":").indent().softNewLine();
if (i == 0 && methodNode.getModifiers().contains(NodeModifier.SYNCHRONIZED)) {
if (i == 0 && methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) {
writer.appendMethodBody(new MethodReference(Object.class, "monitorEnter",
Object.class, void.class));
writer.append("(");
@ -830,7 +829,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
writer.append("default:").ws().appendFunction("$rt_invalidPointer").append("();").softNewLine();
writer.append("}}").softNewLine();
if (methodNode.getModifiers().contains(NodeModifier.SYNCHRONIZED)) {
if (methodNode.getModifiers().contains(ElementModifier.SYNCHRONIZED)) {
writer.outdent().append("}").ws().append("finally").ws().append('{').indent().softNewLine();
writer.append("if").ws().append("(!").appendFunction("$rt_suspending").append("())")
.ws().append("{").indent().softNewLine();
@ -901,7 +900,7 @@ public class Renderer implements ExprVisitor, StatementVisitor, RenderingContext
}
private void appendMonitor(MethodNode methodNode) throws IOException {
if (methodNode.getModifiers().contains(NodeModifier.STATIC)) {
if (methodNode.getModifiers().contains(ElementModifier.STATIC)) {
writer.appendFunction("$rt_cls").append("(")
.appendClass(methodNode.getReference().getClassName()).append(")");
} else {