From f4920b7d0990fcd6b315bf2843bbb7a7046d8d66 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Sat, 26 May 2012 12:42:06 +0400 Subject: [PATCH] added 'Pseudocode' interface 'Pseudocode' class was renamed to 'PseudocodeImpl' --- .../jet/lang/cfg/pseudocode/IPseudocode.java | 49 +++++++++++++++++++ .../{Pseudocode.java => PseudocodeImpl.java} | 37 +++++++++++--- 2 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/IPseudocode.java rename compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/{Pseudocode.java => PseudocodeImpl.java} (92%) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/IPseudocode.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/IPseudocode.java new file mode 100644 index 00000000000..55f2d54570d --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/IPseudocode.java @@ -0,0 +1,49 @@ +/* + * Copyright 2010-2012 JetBrains s.r.o. + * + * 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.jetbrains.jet.lang.cfg.pseudocode; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.psi.JetElement; + +import java.util.List; +import java.util.Set; + +/** + * @author svtk + */ +public interface IPseudocode { + @NotNull + JetElement getCorrespondingElement(); + + @NotNull + Set getLocalDeclarations(); + + @NotNull + List getInstructions(); + + @NotNull + List getDeadInstructions(); + + @NotNull + SubroutineExitInstruction getExitInstruction(); + + @NotNull + SubroutineSinkInstruction getSinkInstruction(); + + @NotNull + SubroutineEnterInstruction getEnterInstruction(); +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java similarity index 92% rename from compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java rename to compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java index 1c5303de8fe..bac83677def 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/Pseudocode.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/pseudocode/PseudocodeImpl.java @@ -22,14 +22,17 @@ import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.cfg.Label; +import org.jetbrains.jet.lang.cfg.LoopInfo; import org.jetbrains.jet.lang.psi.JetElement; +import org.jetbrains.jet.lang.psi.JetExpression; import java.util.*; /** * @author abreslav +* @author svtk */ -public class Pseudocode { +public class PseudocodeImpl implements IPseudocode { public class PseudocodeLabel implements Label { private final String name; @@ -74,6 +77,9 @@ public class Pseudocode { private final List mutableInstructionList = new ArrayList(); private final List instructions = new ArrayList(); private List deadInstructions; + + final Map representativeInstructions = new HashMap(); + final Map loopInfo = Maps.newHashMap(); private final List labels = new ArrayList(); private final List allowedDeadLabels = new ArrayList(); @@ -85,16 +91,20 @@ public class Pseudocode { private SubroutineExitInstruction errorInstruction; private boolean postPrecessed = false; - public Pseudocode(JetElement correspondingElement) { + public PseudocodeImpl(JetElement correspondingElement) { this.correspondingElement = correspondingElement; } + @NotNull + @Override public JetElement getCorrespondingElement() { return correspondingElement; } - public Set getLocalDeclarations() { - Set localDeclarations = Sets.newLinkedHashSet(); + @NotNull + @Override + public Set getLocalDeclarations() { + Set localDeclarations = Sets.newLinkedHashSet(); //todo look recursively inside local declarations for (Instruction instruction : instructions) { if (instruction instanceof LocalDeclarationInstruction) { @@ -118,6 +128,7 @@ public class Pseudocode { stopAllowDeadLabels.add((PseudocodeLabel) label); } + @Override @NotNull public List getInstructions() { return instructions; @@ -128,7 +139,8 @@ public class Pseudocode { public List getMutableInstructionList() { return mutableInstructionList; } - + + @Override @NotNull public List getDeadInstructions() { if (deadInstructions != null) { @@ -174,19 +186,30 @@ public class Pseudocode { public void addInstruction(Instruction instruction) { mutableInstructionList.add(instruction); instruction.setOwner(this); + + if (instruction instanceof JetElementInstruction) { + JetElementInstruction elementInstruction = (JetElementInstruction) instruction; + representativeInstructions.put(elementInstruction.getElement(), instruction); + } } + public void recordLoopInfo(JetExpression expression, LoopInfo blockInfo) { + loopInfo.put(expression, blockInfo); + } + + @Override @NotNull public SubroutineExitInstruction getExitInstruction() { return exitInstruction; } + @Override @NotNull public SubroutineSinkInstruction getSinkInstruction() { return sinkInstruction; } - + @Override @NotNull public SubroutineEnterInstruction getEnterInstruction() { return (SubroutineEnterInstruction) mutableInstructionList.get(0); @@ -251,7 +274,7 @@ public class Pseudocode { @Override public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) { - instruction.getBody().postProcess(); + ((PseudocodeImpl)instruction.getBody()).postProcess(); instruction.setNext(getSinkInstruction()); } -- GitLab