Mercurial > hg > graal-compiler
comparison graal/com.oracle.truffle.dsl.processor/src/com/oracle/truffle/dsl/processor/parser/NodeParser.java @ 18771:15fe16c45d64
Truffle-DSL: changed specialization class naming scheme to use method name. This usually leads to shorter specialization class names.
author | Christian Humer <christian.humer@gmail.com> |
---|---|
date | Mon, 05 Jan 2015 01:31:07 +0100 |
parents | a665483c3881 |
children | 7382bbcac3a3 |
comparison
equal
deleted
inserted
replaced
18770:2c669386b5d0 | 18771:15fe16c45d64 |
---|---|
595 } | 595 } |
596 } | 596 } |
597 } | 597 } |
598 } | 598 } |
599 | 599 |
600 List<SpecializationData> needsId = new ArrayList<>(); | |
601 for (SpecializationData specialization : node.getSpecializations()) { | |
602 if (specialization.isFallback()) { | |
603 specialization.setId("Generic"); | |
604 } else if (specialization.isUninitialized()) { | |
605 specialization.setId("Uninitialized"); | |
606 } else if (specialization.isPolymorphic()) { | |
607 specialization.setId("Polymorphic"); | |
608 } else if (specialization.isSpecialized()) { | |
609 needsId.add(specialization); | |
610 } else { | |
611 throw new AssertionError(); | |
612 } | |
613 } | |
614 | |
615 // verify specialization parameter length | 600 // verify specialization parameter length |
616 List<String> ids = initializeSpecializationIds(needsId); | 601 initializeSpecializationIdsWithMethodNames(node.getSpecializations()); |
617 for (int i = 0; i < ids.size(); i++) { | |
618 needsId.get(i).setId(ids.get(i)); | |
619 } | |
620 | |
621 } | 602 } |
622 | 603 |
623 private static void initializeOrder(NodeData node) { | 604 private static void initializeOrder(NodeData node) { |
624 List<SpecializationData> specializations = node.getSpecializations(); | 605 List<SpecializationData> specializations = node.getSpecializations(); |
625 Collections.sort(specializations); | 606 Collections.sort(specializations); |
804 } | 785 } |
805 current.setReachable(shadowedBy == null); | 786 current.setReachable(shadowedBy == null); |
806 } | 787 } |
807 } | 788 } |
808 | 789 |
809 private static List<String> initializeSpecializationIds(List<SpecializationData> specializations) { | 790 private static void initializeSpecializationIdsWithMethodNames(List<SpecializationData> specializations) { |
810 int lastSize = -1; | |
811 List<List<String>> signatureChunks = new ArrayList<>(); | |
812 for (SpecializationData other : specializations) { | |
813 if (!other.isSpecialized()) { | |
814 continue; | |
815 } | |
816 List<String> paramIds = new LinkedList<>(); | |
817 paramIds.add(ElementUtils.getTypeId(other.getReturnType().getType())); | |
818 for (Parameter param : other.getParameters()) { | |
819 if (param.getSpecification().getExecution() == null) { | |
820 continue; | |
821 } | |
822 paramIds.add(ElementUtils.getTypeId(param.getType())); | |
823 } | |
824 assert lastSize == -1 || lastSize == paramIds.size(); | |
825 if (lastSize != -1 && lastSize != paramIds.size()) { | |
826 throw new AssertionError(); | |
827 } | |
828 signatureChunks.add(paramIds); | |
829 lastSize = paramIds.size(); | |
830 } | |
831 | |
832 // reduce id vertically | |
833 for (int i = 0; i < lastSize; i++) { | |
834 String prev = null; | |
835 boolean allSame = true; | |
836 for (List<String> signature : signatureChunks) { | |
837 String arg = signature.get(i); | |
838 if (prev == null) { | |
839 prev = arg; | |
840 continue; | |
841 } else if (!prev.equals(arg)) { | |
842 allSame = false; | |
843 break; | |
844 } | |
845 prev = arg; | |
846 } | |
847 | |
848 if (allSame) { | |
849 for (List<String> signature : signatureChunks) { | |
850 signature.remove(i); | |
851 } | |
852 lastSize--; | |
853 } | |
854 } | |
855 | |
856 // reduce id horizontally | |
857 for (List<String> signature : signatureChunks) { | |
858 if (signature.isEmpty()) { | |
859 continue; | |
860 } | |
861 String prev = null; | |
862 boolean allSame = true; | |
863 for (String arg : signature) { | |
864 if (prev == null) { | |
865 prev = arg; | |
866 continue; | |
867 } else if (!prev.equals(arg)) { | |
868 allSame = false; | |
869 break; | |
870 } | |
871 prev = arg; | |
872 } | |
873 | |
874 if (allSame) { | |
875 signature.clear(); | |
876 signature.add(prev); | |
877 } | |
878 } | |
879 | |
880 // create signatures | |
881 List<String> signatures = new ArrayList<>(); | 791 List<String> signatures = new ArrayList<>(); |
882 for (List<String> signatureChunk : signatureChunks) { | 792 for (SpecializationData specialization : specializations) { |
883 StringBuilder b = new StringBuilder(); | 793 if (specialization.isFallback()) { |
884 if (signatureChunk.isEmpty()) { | 794 signatures.add("Fallback"); |
885 b.append("Default"); | 795 } else if (specialization.isUninitialized()) { |
796 signatures.add("Uninitialized"); | |
797 } else if (specialization.isPolymorphic()) { | |
798 signatures.add("Polymorphic"); | |
886 } else { | 799 } else { |
887 for (String s : signatureChunk) { | 800 String name = specialization.getMethodName(); |
888 b.append(s); | 801 |
889 } | 802 // hack for name clashes with BaseNode. |
890 } | 803 if (name.equalsIgnoreCase("base")) { |
891 signatures.add(b.toString()); | 804 name = name + "0"; |
892 } | 805 } |
893 | 806 |
807 signatures.add(ElementUtils.firstLetterUpperCase(name)); | |
808 } | |
809 } | |
810 | |
811 renameDuplicateIds(signatures); | |
812 for (int i = 0; i < specializations.size(); i++) { | |
813 specializations.get(i).setId(signatures.get(i)); | |
814 } | |
815 } | |
816 | |
817 private static void renameDuplicateIds(List<String> signatures) { | |
894 Map<String, Integer> counts = new HashMap<>(); | 818 Map<String, Integer> counts = new HashMap<>(); |
895 for (String s1 : signatures) { | 819 for (String s1 : signatures) { |
896 Integer count = counts.get(s1); | 820 Integer count = counts.get(s1); |
897 if (count == null) { | 821 if (count == null) { |
898 count = 0; | 822 count = 0; |
912 number++; | 836 number++; |
913 } | 837 } |
914 } | 838 } |
915 } | 839 } |
916 } | 840 } |
917 | |
918 return signatures; | |
919 } | 841 } |
920 | 842 |
921 private void initializeGuards(List<? extends Element> elements, NodeData node) { | 843 private void initializeGuards(List<? extends Element> elements, NodeData node) { |
922 Map<String, List<ExecutableElement>> potentialGuards = new HashMap<>(); | 844 Map<String, List<ExecutableElement>> potentialGuards = new HashMap<>(); |
923 for (SpecializationData specialization : node.getSpecializations()) { | 845 for (SpecializationData specialization : node.getSpecializations()) { |