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()) {