Changeset 3916
- Timestamp:
- 07/02/09 14:57:49 (5 months ago)
- Location:
- trunk/ProjectFortress/src/com/sun/fortress/compiler/codegen
- Files:
-
- 2 modified
-
CodeGen.java (modified) (4 diffs)
-
CodeGenMethodVisitor.java (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ProjectFortress/src/com/sun/fortress/compiler/codegen/CodeGen.java
r3914 r3916 840 840 // We create separate taskClasses for every task 841 841 public String delegate(ASTNode x) { 842 843 if (! (x instanceof _RewriteFnApp)) { 844 sayWhat(x); 845 } 846 847 _RewriteFnApp _rewriteFnApp = (_RewriteFnApp) x; 848 849 Expr function = _rewriteFnApp.getFunction(); 850 851 System.out.println("BBBBBBB: function = " + function); 852 ExprInfo info = function.getInfo(); 853 Option<Type> exprType = info.getExprType(); 854 855 856 if (!exprType.isSome()) { 857 sayWhat(x, "Missing type information for delegate " + x); 858 } 859 860 String desc = NamingCzar.jvmTypeDesc(exprType.unwrap(), component.getName()); 861 862 List<String> args = CodeGenMethodVisitor.parseArgs(desc); 863 String result = CodeGenMethodVisitor.parseResult(desc); 864 842 865 String className = NamingCzar.gensymTaskName(packageAndClassName); 843 866 debug("delegate creating class " + className + " node = " + x); … … 846 869 cg.localsDepth = 0; 847 870 cg.cw = new CodeGenClassWriter(ClassWriter.COMPUTE_FRAMES); 848 849 871 cg.cw.visitSource(className,null); 850 872 … … 854 876 className,null, NamingCzar.fortressBaseTask, null); 855 877 856 // FIXME, this assumes we only take a ZZ32 argument. 857 cg.mv = cg.cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", 858 "(" + NamingCzar.descFortressZZ32 + ")V", null, null); 878 String initDesc = "("; 879 880 for (String arg : args) { 881 initDesc = initDesc + arg; 882 } 883 initDesc = initDesc + ")V"; 884 885 System.out.println("initDesc = " + initDesc + "should be (ZZ32)V"); 886 887 cg.mv = cg.cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", initDesc, null, null); 859 888 cg.mv.visitCode(); 889 860 890 cg.mv.visitVarInsn(Opcodes.ALOAD, cg.mv.getLocalVariable("instance")); 861 891 cg.mv.visitMethodInsn(Opcodes.INVOKESPECIAL, NamingCzar.fortressBaseTask, 862 892 "<init>", NamingCzar.voidToVoid); 863 893 cg.mv.visitVarInsn(Opcodes.ALOAD, cg.mv.getLocalVariable("instance")); 894 895 // Fib specific 864 896 cg.mv.visitVarInsn(Opcodes.ALOAD, 1); 865 cg.mv.visitFieldInsn(Opcodes.PUTFIELD, className, "n", NamingCzar.descFortressZZ32);897 cg.mv.visitFieldInsn(Opcodes.PUTFIELD, className, "n", args.get(0)); 866 898 867 899 cg.mv.visitInsn(Opcodes.RETURN); … … 881 913 882 914 // Fixme, not all results are ZZ32 883 cg.mv.visitFieldInsn(Opcodes.PUTFIELD, className, "result", NamingCzar.descFortressZZ32);915 cg.mv.visitFieldInsn(Opcodes.PUTFIELD, className, "result", result); 884 916 885 917 cg.mv.visitInsn(Opcodes.RETURN); -
trunk/ProjectFortress/src/com/sun/fortress/compiler/codegen/CodeGenMethodVisitor.java
r3914 r3916 43 43 int localVariableCount; 44 44 45 static void error(String s) {throw new RuntimeException("Bad Signature " + s);} 45 static void error(String s) {throw new RuntimeException("Bad Signature " + s);} 46 46 47 private void parseDescriptor(String desc) { 48 argumentTypes = new ArrayList<String>(); 47 // Move these to their own class 49 48 50 System.out.println("parseDescriptor: " + desc);51 49 public static List<String> parseArgs(String desc) { 50 List<String> args = new ArrayList<String>(); 52 51 if (desc.charAt(0) != '(') error(desc); 53 52 int i = 1; … … 57 56 58 57 while (ch != ')') { 59 System.out.println("parseDescriptor: desc = " + desc +60 " i = " + i + " argumentTypes = " + argumentTypes);61 62 58 switch(ch) { 63 59 case 'B': … … 69 65 case 'J': 70 66 case 'Z': 71 arg umentTypes.add(Character.toString(desc.charAt(i))); ch = desc.charAt(++i); break;67 args.add(Character.toString(desc.charAt(i))); ch = desc.charAt(++i); break; 72 68 case '[': 73 69 case 'L': … … 76 72 ch = desc.charAt(++i); 77 73 } 78 arg umentTypes.add(desc.substring(start, ++i));74 args.add(desc.substring(start, ++i)); 79 75 ch = desc.charAt(i); 80 76 break; … … 82 78 } 83 79 } 84 ch = desc.charAt(++i); 80 return args; 81 } 85 82 83 public static String parseResult(String desc) { 84 int i = desc.indexOf(')') + 1; 85 int ch = desc.charAt(i); 86 int start; 86 87 switch(ch) { 87 88 case 'B': … … 94 95 case 'Z': 95 96 case 'V': 96 re sultType = Character.toString(desc.charAt(i)); break;97 return Character.toString(desc.charAt(i)); 97 98 case '[': 98 99 start = i; … … 100 101 ch = desc.charAt(++i); 101 102 } 102 resultType = new String(desc.substring(start, ++i)); 103 break; 103 return new String(desc.substring(start, ++i)); 104 104 case 'L': 105 105 start = i; … … 107 107 ch = desc.charAt(++i); 108 108 } 109 resultType = new String(desc.substring(start, ++i)); 110 break; 109 return new String(desc.substring(start, ++i)); 111 110 default: error(desc); 112 111 } 113 System.out.println("parseDescriptor: desc = " + desc + 114 " i = " + i + " argumentTypes = " + argumentTypes + 115 " resultType = " + resultType); 112 return ("Shouln't happen"); 116 113 } 114 117 115 118 116 public CodeGenMethodVisitor(int access, String name, String desc, … … 125 123 this.signature = signature; 126 124 this.exceptions = exceptions; 125 this.argumentTypes = parseArgs(desc); 126 this.resultType = parseResult(desc); 127 127 128 128 this.localVariableTable = new HashMap<String, Integer>(); … … 133 133 createLocalVariable("instance", name); 134 134 } 135 136 parseDescriptor(desc);137 135 138 136 System.out.println("MethodVisitor: name = " + name + " desc = " + desc +

