From: <ma...@us...> - 2010-09-22 06:13:30
|
Revision: 16617 http://x10.svn.sourceforge.net/x10/?rev=16617&view=rev Author: makinoy Date: 2010-09-22 06:13:21 +0000 (Wed, 22 Sep 2010) Log Message: ----------- WIP on a new generics implementation of Managed X10. Related: XTENLANG-533, 978, 979 Modified Paths: -------------- trunk/x10.compiler/src/x10/ast/X10ClassDecl_c.java trunk/x10.compiler/src/x10/emitter/Emitter.java trunk/x10.compiler/src/x10/visit/X10PrettyPrinterVisitor.java trunk/x10.compiler/src/x10c/visit/InlineHelper.java trunk/x10.compiler/src/x10c/visit/JavaCaster.java trunk/x10.runtime/src-java/x10/core/AnyRail.java trunk/x10.runtime/src-java/x10/core/GrowableRail.java trunk/x10.runtime/src-java/x10/core/Rail.java trunk/x10.runtime/src-java/x10/core/RailFactory.java trunk/x10.runtime/src-java/x10/core/ValRail.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_1.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_2.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_3.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_4.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_5.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_6.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_7.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_8.java trunk/x10.runtime/src-java/x10/core/fun/Fun_0_9.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_1.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_2.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_3.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_4.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_5.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_6.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_7.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_8.java trunk/x10.runtime/src-java/x10/core/fun/VoidFun_0_9.java trunk/x10.runtime/src-java/x10/rtt/BooleanType.java trunk/x10.runtime/src-java/x10/rtt/ByteType.java trunk/x10.runtime/src-java/x10/rtt/CharType.java trunk/x10.runtime/src-java/x10/rtt/DoubleType.java trunk/x10.runtime/src-java/x10/rtt/FloatType.java trunk/x10.runtime/src-java/x10/rtt/IntType.java trunk/x10.runtime/src-java/x10/rtt/LongType.java trunk/x10.runtime/src-java/x10/rtt/ShortType.java trunk/x10.runtime/src-x10/x10/lang/Indexable.x10 trunk/x10.runtime/src-x10/x10/lang/Iterable.x10 trunk/x10.runtime/src-x10/x10/lang/Iterator.x10 trunk/x10.runtime/src-x10/x10/lang/Settable.x10 Removed Paths: ------------- trunk/x10.runtime/src-java/x10/core/Indexable.java trunk/x10.runtime/src-java/x10/core/Iterable.java trunk/x10.runtime/src-java/x10/core/Iterator.java trunk/x10.runtime/src-java/x10/core/RailIterator.java trunk/x10.runtime/src-java/x10/core/Settable.java Modified: trunk/x10.compiler/src/x10/ast/X10ClassDecl_c.java =================================================================== --- trunk/x10.compiler/src/x10/ast/X10ClassDecl_c.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.compiler/src/x10/ast/X10ClassDecl_c.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -679,19 +679,20 @@ } - Map<X10ClassDef,X10ClassType> map = new HashMap<X10ClassDef, X10ClassType>(); - for (X10ClassType ct : supers) { - X10ClassType t = map.get(ct.x10Def()); - if (t != null) { - if (!t.typeEquals(ct, tc.context())) { - String kind = ct.flags().isInterface() ? "interface" : "class"; - Errors.issue(tc.job(), - new Errors.CannotExtendTwoInstancesSameInterfaceLimitation(t, ct, - position())); - } - } - map.put(ct.x10Def(), ct); - } + // fix for XTENLANG-978 +// Map<X10ClassDef,X10ClassType> map = new HashMap<X10ClassDef, X10ClassType>(); +// for (X10ClassType ct : supers) { +// X10ClassType t = map.get(ct.x10Def()); +// if (t != null) { +// if (!t.typeEquals(ct, tc.context())) { +// String kind = ct.flags().isInterface() ? "interface" : "class"; +// Errors.issue(tc.job(), +// new Errors.CannotExtendTwoInstancesSameInterfaceLimitation(t, ct, +// position())); +// } +// } +// map.put(ct.x10Def(), ct); +// } n = (X10ClassDecl_c) n.adjustAbstractMethods(oldtc); Modified: trunk/x10.compiler/src/x10/emitter/Emitter.java =================================================================== --- trunk/x10.compiler/src/x10/emitter/Emitter.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.compiler/src/x10/emitter/Emitter.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -22,6 +22,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import polyglot.ast.Binary; @@ -53,6 +54,7 @@ import polyglot.types.QName; import polyglot.types.Ref; import polyglot.types.SemanticException; +import polyglot.types.StructType; import polyglot.types.Type; import polyglot.types.TypeSystem; import polyglot.types.Types; @@ -77,10 +79,15 @@ import x10.types.X10Def; import x10.types.X10Flags; import x10.types.X10MethodInstance; +import x10.types.X10ParsedClassType; import x10.types.X10ParsedClassType_c; +import x10.types.X10TypeEnv; +import x10.types.X10TypeEnv_c; import x10.types.X10TypeMixin; import x10.types.X10TypeSystem; +import x10.types.X10TypeSystem_c; import x10.types.checker.Converter; +import x10.types.matcher.X10TypeMatcher; import x10.visit.X10PrettyPrinterVisitor; import x10c.types.BackingArrayType; @@ -554,7 +561,7 @@ type.print(w); } } else if (type.isNull()) { - w.write("java.lang.Object"); + w.write(X10PrettyPrinterVisitor.JAVA_LANG_OBJECT); } else { type.print(w); } @@ -1038,15 +1045,30 @@ } if (n.typeParameters().size() > 0) w.write("> "); - - printType( - n.returnType().type(), - X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS - ); + + boolean isDispatch = false; + if (X10PrettyPrinterVisitor.isSelfDispatch && c.currentClass().flags().isInterface()) { + for (int i = 0; i < n.formals().size(); i++) { + Type type = n.formals().get(i).type().type(); + if (containsTypeParam(type)) { + isDispatch = true; + break; + } + } + } + + if (isDispatch) { + w.write(X10PrettyPrinterVisitor.JAVA_LANG_OBJECT); + } else { + printType( + n.returnType().type(), + X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS + ); + } w.allowBreak(2, 2, " ", 1); tr.print(n, n.name(), w); - if (X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType) { + if (!isDispatch && X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType) { w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); } w.write("("); @@ -1068,7 +1090,7 @@ w.write(" "); w.write(Emitter.mangleToJava(p.name().id())); } - + int formalNum = 1; for (int i = 0; i < n.formals().size(); i++) { Formal f = n.formals().get(i); if (!first) { @@ -1078,18 +1100,36 @@ first = false; tr.print(n, f.flags(), w); - printType( - f.type().type(), - X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS - | (boxPrimitives ? X10PrettyPrinterVisitor.BOX_PRIMITIVES - : 0)); - w.write(" "); + Type type = f.type().type(); + + if (X10PrettyPrinterVisitor.isSelfDispatch && c.currentClass().flags().isInterface() && containsTypeParam(type)) { + printType(type, 0); + w.write(" "); + Name name = f.name().id(); + if (name.toString().equals("")) { + name = Name.makeFresh("a"); + } + tr.print(n, f.name().id(name), w); - Name name = f.name().id(); - if (name.toString().equals("")) { - name = Name.makeFresh("a"); + w.write(","); + w.write(X10PrettyPrinterVisitor.X10_RUNTIME_TYPE_CLASS); + w.write(" "); + Name name1 = Name.make("t" + formalNum++); + tr.print(n, f.name().id(name1), w); } - tr.print(n, f.name().id(name), w); + else { + printType( + type, + (n.flags().flags().isStatic() ? X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS : 0) | + (boxPrimitives ? X10PrettyPrinterVisitor.BOX_PRIMITIVES: 0) + ); + w.write(" "); + Name name = f.name().id(); + if (name.toString().equals("")) { + name = Name.makeFresh("a"); + } + tr.print(n, f.name().id(name), w); + } } w.end(); @@ -1138,7 +1178,24 @@ } } - public void generateBridgeMethods(X10ClassDef cd) { + public static boolean containsTypeParam(Type type) { + if (type instanceof ParameterType) { + return true; + } + else if (type instanceof X10ClassType) { + List<Type> tas = ((X10ClassType) type).typeArguments(); + if (tas != null) { + for (Type type1 : tas) { + if (containsTypeParam(type1)) { + return true; + } + } + } + } + return false; + } + + public void generateBridgeMethods(X10ClassDef cd) { if (cd.flags().isInterface()) { return; } @@ -1158,18 +1215,57 @@ getInheritedMethods(ct, inheriteds); for (MethodInstance mi : inheriteds) { if (isInstantiate(mi.def().returnType().get(), mi.returnType())) { - printInheritedMethodBridge(mi, mi.def()); + printInheritedMethodBridge(mi); break; } for (int i = 0; i < mi.formalTypes().size(); ++ i) { if (isPrimitive(mi.formalTypes().get(i)) && isInstantiate(mi.def().formalTypes().get(i).get(), mi.formalTypes().get(i))) { - printInheritedMethodBridge(mi, mi.def()); + printInheritedMethodBridge(mi); break; } } - + List<MethodInstance> implMethods = new ArrayList<MethodInstance>(); + List<Type> interfaces = ct.interfaces(); + getImplMethods(mi, implMethods, interfaces); + for (MethodInstance mi2 : implMethods) { + printBridgeMethod(mi, mi2.def()); + } } } + + private void getImplMethods(MethodInstance mi, List<MethodInstance> implMethods, List<Type> interfaces) { + for (Type type : interfaces) { + if (type instanceof X10ClassType) { + List<MethodInstance> imis = ((X10ClassType) type).methods(); + for (MethodInstance imi : imis) { + if (!(imi.name().equals(mi.name()) && imi.formalTypes().size() == mi.formalTypes().size())) continue; + if (isContainInstantiateSamePlace(implMethods, imi)) continue; + Type returnType = mi.returnType(); + if ( + returnType.typeEquals(imi.returnType() , tr.context()) + && X10TypeMixin.baseType(imi.def().returnType().get()) instanceof ParameterType + && !(X10TypeMixin.baseType(returnType) instanceof ParameterType) + ) { + implMethods.add(imi); + break; + } + List<Ref<? extends Type>> types = imi.def().formalTypes(); + for (int i = 0;i < types.size(); ++i) { + if ( + mi.formalTypes().get(i).typeEquals(imi.formalTypes().get(i), tr.context()) + && isPrimitive(mi.formalTypes().get(i)) + && types.get(i).get() instanceof ParameterType + && !(mi.formalTypes().get(i) instanceof ParameterType) + ) { + implMethods.add(imi); + break; + } + } + } + getImplMethods(mi, implMethods, ((X10ClassType) type).interfaces()); + } + } + } private List<MethodInstance> getInstantiatedMethods(X10ClassType ct, MethodInstance mi) { List<MethodInstance> methods = new ArrayList<MethodInstance>(); @@ -1379,11 +1475,12 @@ } } - private void printInheritedMethodBridge(MethodInstance impl, MethodDef def) { + private void printInheritedMethodBridge(MethodInstance mi) { + MethodDef def = mi.def(); w.write("// bridge for " + def); w.newline(); - Flags flags = X10Flags.toX10Flags(impl.flags()); + Flags flags = X10Flags.toX10Flags(mi.flags()); w.begin(0); w.write(flags.clearAbstract() @@ -1392,18 +1489,18 @@ .translate() ); - printType(impl.returnType(), X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS); + printType(mi.returnType(), X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS); w.allowBreak(2, 2, " ", 1); - w.write(mangleToJava(impl.name())); + w.write(mangleToJava(mi.name())); - if (X10TypeMixin.baseType(impl.returnType()) instanceof ParameterType) { + if (X10TypeMixin.baseType(mi.returnType()) instanceof ParameterType) { w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); } w.write("("); for (int i = 0; i < def.formalTypes().size(); i++) { - Type f = impl.formalTypes().get(i); + Type f = mi.formalTypes().get(i); if (i != 0) { w.write(","); w.allowBreak(0, " "); @@ -1418,10 +1515,10 @@ w.end(); w.write(")"); - if (!impl.throwTypes().isEmpty()) { + if (!mi.throwTypes().isEmpty()) { w.allowBreak(6); w.write("throws "); - for (Iterator<Type> i = impl.throwTypes().iterator(); i.hasNext();) { + for (Iterator<Type> i = mi.throwTypes().iterator(); i.hasNext();) { Type t = i.next(); printType(t, X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS); if (i.hasNext()) { @@ -1432,20 +1529,20 @@ } w.write("{"); - if (!impl.returnType().isVoid()) { + if (!mi.returnType().isVoid()) { w.write("return "); } w.write("super."); - w.write(mangleToJava(impl.name())); + w.write(mangleToJava(mi.name())); if (X10TypeMixin.baseType(def.returnType().get()) instanceof ParameterType) { w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); } w.write("("); - for (int i = 0; i < impl.formalTypes().size(); i++) { - Type f = impl.formalTypes().get(i); + for (int i = 0; i < mi.formalTypes().size(); i++) { + Type f = mi.formalTypes().get(i); if (i != 0) { w.write(","); w.allowBreak(0, " "); @@ -1796,7 +1893,7 @@ } } - public boolean isNoArgumentType(Expr e) { + private boolean isNoArgumentType(Expr e) { while (e instanceof ParExpr_c) { e = ((ParExpr_c) e).expr(); if (e == null) { @@ -2182,4 +2279,301 @@ } throw new InternalCompilerError(""); // TODO } + + public void generateDispatchMethods(X10ClassDef cd) { + if (cd.flags().isInterface()) { + return; + } + + X10ClassType ct = (X10ClassType) cd.asType(); + + List<MethodInstance> methods = ct.methods(); + Map<MethodInstance, List<MethodInstance>> dispatcherToMyMethods = new HashMap<MethodInstance,List<MethodInstance>>(); + for (MethodInstance myMethod : methods) { + List<MethodInstance> implementeds = myMethod.implemented(tr.context()); + List<MethodInstance> targets = new ArrayList<MethodInstance>(); + for (MethodInstance implemented : implementeds) { + if (implemented.def().equals(myMethod.def())) continue; + + // only interface + StructType st = implemented.def().container().get(); + if (st instanceof X10ClassType) { + if (!((X10ClassType) st).flags().isInterface()) { + continue; + } + } + + boolean isContainsTypeParams = false; + List<Ref<? extends Type>> formalTypes = implemented.def().formalTypes(); + for (Ref<? extends Type> ref : formalTypes) { + Type type = ref.get(); + if (containsTypeParam(type)) { + isContainsTypeParams = true; + break; + } +// if (type instanceof ParameterType) { +// isContainsTypeParams = true; +// break; +// } + } + if (!isContainsTypeParams) continue; + + // only implements by itself not super class's + List<Type> allInterfaces = new ArrayList<Type>(); + getAllInterfaces(ct.interfaces(), allInterfaces); + boolean isContainInterfaces = false; + for (Type type : allInterfaces) { + if (type.typeEquals(implemented.container(), tr.context())) { + isContainInterfaces = true; + break; + } + } + if (!isContainInterfaces) continue; + + if (!isContainSameSignature(targets, implemented)) { + targets.add(implemented); + } + } + + for (MethodInstance target : targets) { + boolean isContainsSameSignature = false; + Set<Entry<MethodInstance, List<MethodInstance>>> entrySet = dispatcherToMyMethods.entrySet(); + for (Entry<MethodInstance, List<MethodInstance>> entry : entrySet) { + + MethodDef md = entry.getKey().def(); + MethodDef td = target.def(); + if (md.name().equals(td.name()) && md.formalTypes().size() == td.formalTypes().size()) { + List<Ref<? extends Type>> formalTypes = md.formalTypes(); + isContainsSameSignature = true; + for (int i = 0; i < formalTypes.size(); ++i) { + Type ft = formalTypes.get(i).get(); + Type tt = td.formalTypes().get(i).get(); + if ((ft instanceof ParameterType && td.formalTypes().get(i).get() instanceof ParameterType)) {} + else if (ft instanceof X10ClassType && tt instanceof X10ClassType && ((X10ClassType) ft).name().toString().equals(((X10ClassType) tt).name().toString())) {} + else { + isContainsSameSignature = false; + break; + } + } + if (isContainsSameSignature) { + entry.getValue().add(myMethod); + } + } + } + if (isContainsSameSignature) break; + + ArrayList<MethodInstance> mis = new ArrayList<MethodInstance>(); + mis.add(myMethod); + dispatcherToMyMethods.put(target, mis); + } + } + + Set<Entry<MethodInstance, List<MethodInstance>>> entrySet = dispatcherToMyMethods.entrySet(); + for (Entry<MethodInstance, List<MethodInstance>> entry : entrySet) { + printDispatchMethod(entry.getKey(), entry.getValue()); + } + +// List<MethodInstance> inheriteds = new ArrayList<MethodInstance>(); +// getInheritedMethods(ct, inheriteds); // not implement +// for (MethodInstance mi : inheriteds) { +// StructType st = mi.def().container().get(); +// System.out.println(mi); +// if (st instanceof X10ParsedClassType) { +// if (((X10ParsedClassType) st).flags().isInterface()) { +// ArrayList<MethodInstance> mis = new ArrayList<MethodInstance>(); +// mis.add(mi); +// printDispatchMethod(mi, mis); +// } +// } +// } + } + + private void getAllInterfaces(List<Type> interfaces, List<Type> allInterfaces) { + allInterfaces.addAll(interfaces); + for (Type type : interfaces) { + if (type instanceof X10ClassType) { + List<Type> interfaces1 = ((X10ClassType) type).interfaces(); + getAllInterfaces(interfaces1, allInterfaces); + } + } + } + + private boolean isContainSameSignature(List<MethodInstance> targets, MethodInstance mi1) { + boolean isContain = false; + for (MethodInstance mi2 : targets) { + if (mi2.name().equals(mi1.name())) { + List<Type> formalTypes1 = mi1.formalTypes(); + List<Type> formalTypes2 = mi2.formalTypes(); + if (formalTypes1.size() == formalTypes2.size()) { + for (int i = 0; i < formalTypes1.size(); ++i) { + Type type1 = formalTypes1.get(i); + Type type2 = formalTypes2.get(i); + if (type1.typeEquals(type2, tr.context()) || (type1 instanceof ParameterType && type2 instanceof ParameterType)) { + isContain = true; + break; + } + } + } + } + } + return isContain; + } + + private void printDispatchMethod(MethodInstance dispatch, List<MethodInstance> mis) { + MethodDef def = dispatch.def(); + w.write("// dispatcher for " + def); + w.newline(); + + Flags flags = X10Flags.toX10Flags(dispatch.flags()); + + w.begin(0); + w.write(flags.clearAbstract() + .clear(X10Flags.SAFE) + .clear(X10Flags.NATIVE) + .translate() + ); + + // e.g int m() overrides or implements T m() + boolean instantiateReturnType = X10TypeMixin.baseType(def.returnType().get()) instanceof ParameterType; +// if (instantiateReturnType) { +// printType(dispatch.returnType(), X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS | X10PrettyPrinterVisitor.BOX_PRIMITIVES); +// } +// else { +// if (containsTypeParam(def.returnType().get())) { +// +// } +// printType(dispatch.returnType(), X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS); +// } + w.write(X10PrettyPrinterVisitor.JAVA_LANG_OBJECT); + + w.allowBreak(2, 2, " ", 1); + w.write(mangleToJava(dispatch.name())); + + +// if (instantiateReturnType) { +// w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); +// } + + w.write("("); + Name[] names = new Name[def.formalTypes().size()]; + for (int i = 0; i < def.formalTypes().size(); i++) { + Type f = dispatch.formalTypes().get(i); + if (i != 0) { + w.write(","); + w.allowBreak(0, " "); + } + Type type = def.formalTypes().get(i).get(); + if (containsTypeParam(type)) { +// if (X10TypeMixin.baseType(type) instanceof ParameterType) { + if (type instanceof ParameterType) { + w.write(X10PrettyPrinterVisitor.JAVA_LANG_OBJECT); + } else { + printType(type, 0); + } + + w.write(" "); + + Name name = Name.make("a" + (i + 1)); + w.write(name.toString()); + + w.write(","); + w.write(X10PrettyPrinterVisitor.X10_RUNTIME_TYPE_CLASS); + w.write(" "); + Name name1 = Name.make("t" + (i + 1)); + w.write(name1.toString()); + + names[i] = name1; + } else { + printType(f, X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS); + + w.write(" "); + + Name name = Name.make("a" + (i + 1)); + w.write(name.toString()); + } + } + + w.end(); + w.write(")"); + + if (!dispatch.throwTypes().isEmpty()) { + w.allowBreak(6); + w.write("throws "); + for (Iterator<Type> i = dispatch.throwTypes().iterator(); i.hasNext();) { + Type t = i.next(); + printType(t, X10PrettyPrinterVisitor.PRINT_TYPE_PARAMS); + if (i.hasNext()) { + w.write(","); + w.allowBreak(4, " "); + } + } + } + + w.write("{"); + + for (MethodInstance mi : mis) { + if (mis.size() != 1) { + for (int i = 0; i < names.length; i++) { + Name name = names[i]; + if (name == null) continue; + w.write("if ("); + w.write(name.toString()); + w.write(".equals("); + new RuntimeTypeExpander(this, mi.formalTypes().get(i)).expand(); + w.write(")"); + w.write(") {"); + } + } + + if (!mi.returnType().isVoid()) { + w.write("return "); + } + + w.write(mangleToJava(mi.name())); + + if (X10TypeMixin.baseType(dispatch.returnType()) instanceof ParameterType) { + w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + } + + w.write("("); + for (int i = 0; i < mi.formalTypes().size(); i++) { + Type f = mi.formalTypes().get(i); + if (i != 0) { + w.write(","); + w.allowBreak(0, " "); + } + if (def.formalTypes().get(i).get() instanceof ParameterType) { + // FIXME check + if (f.isBoolean() || f.isNumeric()) { + w.write("("); + printType(f, 0); + w.write(")"); + } + + w.write("("); + printType(f, X10PrettyPrinterVisitor.BOX_PRIMITIVES); + w.write(")"); + } + + Name name = Name.make("a" + (i + 1)); + w.write(name.toString()); + } + w.write(")"); + w.write(";"); + if (mi.returnType().isVoid()) { + w.write("return null;"); + } + if (mis.size() != 1) { + w.write("}"); + } + } + + if (mis.size() != 1) { + // TODO + w.write("throw new java.lang.RuntimeException();"); + } + + w.write("}"); + w.newline(); + } } Modified: trunk/x10.compiler/src/x10/visit/X10PrettyPrinterVisitor.java =================================================================== --- trunk/x10.compiler/src/x10/visit/X10PrettyPrinterVisitor.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.compiler/src/x10/visit/X10PrettyPrinterVisitor.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -85,10 +85,12 @@ import polyglot.types.Flags; import polyglot.types.LocalDef; import polyglot.types.LocalInstance; +import polyglot.types.MethodDef; import polyglot.types.MethodInstance; import polyglot.types.MethodInstance_c; import polyglot.types.Name; import polyglot.types.QName; +import polyglot.types.Ref; import polyglot.types.SemanticException; import polyglot.types.Type; import polyglot.types.TypeSystem; @@ -164,6 +166,7 @@ import x10.emitter.Template; import x10.emitter.TryCatchExpander; import x10.emitter.TypeExpander; +import x10.types.ClosureType_c; import x10.types.FunctionType; import x10.types.ParameterType; import x10.types.ParameterType.Variance; @@ -212,8 +215,10 @@ final public Emitter er; public final Type imcType; + public static final String JAVA_LANG_OBJECT = "java.lang.Object"; + public static final boolean isSelfDispatch = true; - private static final String X10_RTT_TYPES = "x10.rtt.Types"; + private static final String X10_RTT_TYPES = "x10.rtt.Types"; private static int nextId_; /* to provide a unique name for local variables introduce in the templates */ @@ -411,7 +416,7 @@ throw new InternalCompilerError("Statement expression uses non-final variable " +li+ "(at " +li.position()+ ") from the outer scope", n.position()); } } - w.write("(new java.lang.Object() { "); + w.write("(new " + JAVA_LANG_OBJECT + "() { "); er.printType(n.type(), PRINT_TYPE_PARAMS); w.write(" eval() {"); w.newline(4); w.begin(0); @@ -489,7 +494,7 @@ // new Object() { T eval(R target, T right) { return (target.f = target.f.add(right)); } }.eval(x, e) Binary.Operator op = n.operator().binaryOperator(); Name methodName = X10Binary_c.binaryMethodName(op); - w.write("new java.lang.Object() {"); + w.write("new " + JAVA_LANG_OBJECT + "() {"); w.allowBreak(0, " "); w.write("final "); er.printType(n.type(), PRINT_TYPE_PARAMS); @@ -818,6 +823,7 @@ sups.add(0, supClassType); } + // FIXME if (sups.size() > 0) { w.write(" extends "); for (int i = 0; i < sups.size(); ++i) { @@ -864,6 +870,7 @@ interfaces.add(tr.nodeFactory().CanonicalTypeNode(n.position(), ts.Any())); } */ + List<Type> alreadyPrintedTypes = new ArrayList<Type>(); if (!interfaces.isEmpty()) { w.allowBreak(2); if (flags.isInterface()) { @@ -876,10 +883,13 @@ w.begin(0); for (Iterator<TypeNode> i = interfaces.iterator(); i.hasNext(); ) { TypeNode tn = (TypeNode) i.next(); - er.printType(tn.type(), PRINT_TYPE_PARAMS | BOX_PRIMITIVES | NO_VARIANCE); - if (i.hasNext()) { - w.write(","); - w.allowBreak(0); + if (!isSelfDispatch || (isSelfDispatch && !alreadyPrinted(alreadyPrintedTypes, tn))) { + if (alreadyPrintedTypes.size() != 0) { + w.write(","); + w.allowBreak(0); + } + alreadyPrintedTypes.add(tn.type()); + er.printType(tn.type(), (isSelfDispatch ? 0 : PRINT_TYPE_PARAMS) | BOX_PRIMITIVES | NO_VARIANCE); } } w.end(); @@ -904,6 +914,9 @@ // Generate dispatcher methods. // er.generateDispatchers(def); + if (isSelfDispatch) { + er.generateDispatchMethods(def); + } er.generateBridgeMethods(def); if (n.typeParameters().size() > 0) { @@ -946,6 +959,45 @@ // } } + private boolean alreadyPrinted(List<Type> alreadyPrintedTypes, TypeNode tn) { + boolean alreadyPrinted = false; + Type type = tn.type(); + if (type instanceof FunctionType) { + if (((FunctionType) type).returnType().isVoid()) { + for (Type apt : alreadyPrintedTypes) { + if (apt instanceof FunctionType && ((FunctionType) apt).returnType().isVoid()) { + if (((FunctionType) apt).typeArguments().size() == ((FunctionType) type).typeArguments().size()) { + alreadyPrinted = true; + break; + } + } + } + } else { + for (Type apt : alreadyPrintedTypes) { + if (apt instanceof FunctionType && !((FunctionType) apt).returnType().isVoid()) { + if (((FunctionType) apt).typeArguments().size() == ((FunctionType) type).typeArguments().size()) { + alreadyPrinted = true; + break; + } + } + } + } + } + else if (type instanceof X10ClassType) { + X10ClassType ct = (X10ClassType) type; + if (ct.typeArguments().size() > 0) { + for (Type apt : alreadyPrintedTypes) { + if (apt instanceof X10ClassType && !(apt instanceof FunctionType)) { + if (((X10ClassType) apt).name().toString().equals(((X10ClassType) type).name().toString())) { + alreadyPrinted = true; + break; + } + } + } + } + } + return alreadyPrinted; + } @@ -1061,7 +1113,7 @@ else if (t instanceof ParameterType) { // SYNOPSIS: (#0) #1 #0=param type #1=primitive or object #2=runtime type String regex = - "(new java.lang.Object() {" + + "(new " + JAVA_LANG_OBJECT + "() {" + "final #0 cast(final Object self) {" + "x10.rtt.Type rtt = #2;" + "#0 dep = (#0) x10.rtt.Types.conversion(rtt,self);" + @@ -1076,7 +1128,7 @@ assert !(t.isBoolean() || t.isNumeric() || t.isChar()); // SYNOPSIS: (#0) #1 #0=type #1=object #2=runtime type String regex = - "(new java.lang.Object() {" + + "(new " + JAVA_LANG_OBJECT + "() {" + "final #0 cast(final #0 self) {" + "if (self==null) return null;" + "x10.rtt.Type rtt = #2;" + @@ -1450,18 +1502,32 @@ X10MethodInstance mi = c.closureInstance(); - c.printSubExpr(target, w, tr); - w.write("."); - w.write("apply"); Expr expr = target; if (target instanceof ParExpr) { expr = ((ParExpr) target).expr(); } - if ( - (!(expr instanceof Closure_c) && !mi.returnType().isVoid()) - || (expr instanceof Closure_c && X10TypeMixin.baseType(mi.returnType()) instanceof ParameterType)) { - w.write(RETURN_PARAMETER_TYPE_SUFFIX); + boolean newClosure = expr instanceof Closure_c; + + if (isSelfDispatch && !newClosure && !c.type().isVoid()) { + w.write("("); + w.write("("); + er.printType(c.type(), BOX_PRIMITIVES); + w.write(")"); } + + c.printSubExpr(target, w, tr); + w.write("."); + w.write("apply"); + if (isSelfDispatch && (!newClosure && !mi.returnType().isVoid() && mi.formalTypes().size() == 0)) { + w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + } + else if ( + !isSelfDispatch + && (!(expr instanceof Closure_c) && !mi.returnType().isVoid()) + || (expr instanceof Closure_c && X10TypeMixin.baseType(mi.returnType()) instanceof ParameterType)) { + w.write(RETURN_PARAMETER_TYPE_SUFFIX); + } + w.write("("); w.begin(0); @@ -1475,16 +1541,24 @@ } List<Expr> l = c.arguments(); - for (Iterator<Expr> i = l.iterator(); i.hasNext(); ) { - Expr e = (Expr) i.next(); + for (int i = 0; i < l.size(); i++) { + Expr e = l.get(i); c.print(e, w, tr); - if (i.hasNext()) { + if (isSelfDispatch && !newClosure) { + w.write(","); + new RuntimeTypeExpander(er, mi.formalTypes().get(i)).expand(); + } + if (i != l.size() - 1) { w.write(","); w.allowBreak(0, " "); } } w.end(); w.write(")"); + + if (isSelfDispatch && !newClosure && !c.type().isVoid()) { + w.write(")"); + } } public void visit(Try_c c) { @@ -1759,7 +1833,7 @@ ex2 }; er.dumpRegex("rail-make", components, tr2, - "(new java.lang.Object() {" + + "(new " + JAVA_LANG_OBJECT + "() {" + "final #0<#1> apply(int length) {" + "#6" + "for (int #5$ = 0; #5$ < length; #5$++) {" + @@ -1855,6 +1929,8 @@ if (xts.isParameterType(t)) { miContainer = new CastExpander(w, er, new TypeExpander(er, mi.container(), false, false, false), miContainer); + } else if (isSelfDispatch && mi.typeParameters().size() > 0) { + miContainer = new CastExpander(w, er, new TypeExpander(er, mi.container(), true, false, false), miContainer); } miContainer = new CastExpander(w, er, miContainer); } @@ -1893,10 +1969,37 @@ } Type returnType = X10TypeMixin.baseType(mi.def().returnType().get()); - if (returnType instanceof ParameterType || (isInstantiateReturn)) { - w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + if (returnType instanceof ParameterType || isInstantiateReturn) { + if (isSelfDispatch) { + Type tt = X10TypeMixin.baseType(target.type()); + + if (tt instanceof X10ClassType && ((X10ClassType) tt).flags().isInterface()) { + boolean isDispatch = false; + List<Ref<? extends Type>> formalTypes = mi.def().formalTypes(); + for (Ref<? extends Type> ref : formalTypes) { + Type ft = ref.get(); + if (Emitter.containsTypeParam(ft)) { + isDispatch = true; + break; + } + } + // FIXME + if (!isDispatch) { + w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + } + } + else if (target instanceof ParExpr && ((ParExpr) target).expr() instanceof Closure_c) { + if (mi.formalTypes().size() == 0) { + w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + } + } + else { + w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + } + } else { + w.write(X10PrettyPrinterVisitor.RETURN_PARAMETER_TYPE_SUFFIX); + } } - w.write("("); w.begin(0); @@ -1910,8 +2013,10 @@ } List<Expr> exprs = c.arguments(); + MethodDef def = c.methodInstance().def(); for (int i = 0; i < exprs.size(); ++i) { Expr e = exprs.get(i); + Type defType = def.formalTypes().get(i).get(); if (runAsync && e instanceof Closure_c) { c.print(((Closure_c)e).methodContainer(mi), w, tr); } @@ -1921,7 +2026,7 @@ else { if (e.type().isBoolean() || e.type().isNumeric() || e.type().isChar()) { // e.g) m((Integer) a) for m(T a) - if (X10TypeMixin.baseType(c.methodInstance().def().formalTypes().get(i).get()) instanceof ParameterType) { + if (X10TypeMixin.baseType(defType) instanceof ParameterType) { w.write("("); er.printType(e.type(), BOX_PRIMITIVES); w.write(")"); @@ -1975,6 +2080,15 @@ } } + // if I is an interface and val i:I , t = type of the type of the formal of method instance + // i.m(a) => i.m(a,t) + if (isSelfDispatch && X10TypeMixin.baseType(t) instanceof X10ClassType ) { + X10ClassType ct = (X10ClassType) X10TypeMixin.baseType(t); + if ((ct.flags().isInterface() || (xts.isFunctionType(ct) && ct.isAnonymous())) && er.containsTypeParam(defType)){ + w.write(","); + new RuntimeTypeExpander(er, c.methodInstance().formalTypes().get(i)).expand(); + } + } if (i != exprs.size() - 1) { w.write(","); w.allowBreak(0, " "); @@ -1994,16 +2108,10 @@ Translator tr2 = ((X10Translator) tr).inInnerClass(true); tr2 = tr2.context(n.enterScope(tr2.context())); - List<Expander> formals = new ArrayList<Expander>(); List<Expander> typeArgs = new ArrayList<Expander>(); for (final Formal f : n.formals()) { TypeExpander ft = new TypeExpander(er, f.type().type(), PRINT_TYPE_PARAMS | BOX_PRIMITIVES); typeArgs.add(ft); // must box formals - formals.add(new Expander(er) { - public void expand(Translator tr) { - er.printFormal(tr, n, f, false); - } - }); } boolean runAsync = false; @@ -2032,30 +2140,39 @@ w.write("() {"); - if (containsPrimitive(n) || !n.returnType().type().isVoid() && !(X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType)) { + List<Formal> formals = n.formals(); + // bridge + boolean bridge = containsPrimitive(n) || !n.returnType().type().isVoid() && !(X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType); + if (bridge) { w.write("public final "); ret.expand(tr2); w.write(" apply"); - if (!n.returnType().type().isVoid()) { + if (!n.returnType().type().isVoid() && (!isSelfDispatch || (isSelfDispatch && n.formals().size() == 0))) { w.write(RETURN_PARAMETER_TYPE_SUFFIX); } w.write("("); - List<Formal> formals2 = n.formals(); - for (int i = 0; i < formals2.size(); ++i) { + for (int i = 0; i < formals.size(); ++i) { if (i != 0) w.write(","); - er.printFormal(tr2, n, formals2.get(i), true); + er.printFormal(tr2, n, formals.get(i), true); + + if (isSelfDispatch) { + w.write(", "); + w.write(X10_RUNTIME_TYPE_CLASS); + w.write(" "); + w.write("t" + (i + 1)); + } } w.write(") { "); if (!n.returnType().type().isVoid()) { w.write("return "); } w.write("apply"); - if (X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType) { + if (X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType && (!isSelfDispatch || (isSelfDispatch && n.formals().size() == 0))) { w.write(RETURN_PARAMETER_TYPE_SUFFIX); } w.write("("); String delim = ""; - for (Formal f: formals2) { + for (Formal f: formals) { w.write(delim); delim = ","; if (f.type().type().isBoolean() || f.type().type().isNumeric() || f.type().type().isChar()) { @@ -2073,11 +2190,21 @@ w.write("public final "); new TypeExpander(er, n.returnType().type(), true, false, false).expand(tr2); w.write(" apply"); - if (X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType) { + if (X10TypeMixin.baseType(n.returnType().type()) instanceof ParameterType && (!isSelfDispatch || (isSelfDispatch && n.formals().size() == 0))) { w.write(RETURN_PARAMETER_TYPE_SUFFIX); } w.write("("); - new Join(er, ", ", formals).expand(tr2); + for (int i = 0; i < formals.size(); i++) { + if (i != 0) w.write(", "); + er.printFormal(tr2, n, formals.get(i), false); + if (isSelfDispatch && !bridge) { + w.write(", "); + w.write(X10_RUNTIME_TYPE_CLASS); + w.write(" "); + w.write("t" + (i + 1)); + } + } + w.write(") { "); List<Stmt> statements = n.body().statements(); @@ -2423,7 +2550,7 @@ }, tr, regex); } else { // SYNOPSIS: for (#0 #2: #1 in #3) #4 #5=unboxed type - String regex = "for (x10.core.Iterator #2__ = (#3).iterator(); #2__.hasNext(); ) { #0 #1 #2 = (#5) #2__.next$G(); #4 }"; + String regex = "for (x10.lang.Iterator #2__ = (#3).iterator(); #2__.hasNext(); ) { #0 #1 #2 = (#5) #2__.next$G(); #4 }"; er.dumpRegex("forloop", new Object[] { form.flags(), form.type(), @@ -2667,7 +2794,7 @@ return; } - w.write("new java.lang.Object() {"); + w.write("new " + JAVA_LANG_OBJECT + "() {"); w.allowBreak(0, " "); w.write("final "); er.printType(n.type(), PRINT_TYPE_PARAMS); @@ -2804,7 +2931,7 @@ // TODO: handle type args // TODO: handle setter method - w.write("new java.lang.Object() {"); + w.write("new " + JAVA_LANG_OBJECT + "() {"); w.allowBreak(0, " "); w.write("final "); er.printType(t, PRINT_TYPE_PARAMS); Modified: trunk/x10.compiler/src/x10c/visit/InlineHelper.java =================================================================== --- trunk/x10.compiler/src/x10c/visit/InlineHelper.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.compiler/src/x10c/visit/InlineHelper.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -219,7 +219,13 @@ excTypes.add(tn.typeRef()); } - Expr call = xnf.Call(pos, xnf.Local(pos, xnf.Id(pos, cd.name())).type(cd.asType()), mdcl.name(), args).methodInstance(mdcl.methodDef().asInstance()).type(mdcl.returnType().type()); + Expr call; + if (mdcl.flags().flags().isStatic()) { + call = xnf.Call(pos, xnf.CanonicalTypeNode(pos, cd.asType()), mdcl.name(), args).methodInstance(mdcl.methodDef().asInstance()).type(mdcl.returnType().type()); + } else { + call = xnf.Call(pos, xnf.Local(pos, xnf.Id(pos, cd.name())).type(cd.asType()), mdcl.name(), args).methodInstance(mdcl.methodDef().asInstance()).type(mdcl.returnType().type()); + } + Block body; if (mdcl.returnType().type().isVoid()) { body = xnf.Block(pos, xnf.Eval(pos, call)); Modified: trunk/x10.compiler/src/x10c/visit/JavaCaster.java =================================================================== --- trunk/x10.compiler/src/x10c/visit/JavaCaster.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.compiler/src/x10c/visit/JavaCaster.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -25,9 +25,12 @@ import polyglot.ast.Node; import polyglot.ast.NodeFactory; import polyglot.ast.NullLit; +import polyglot.ast.Receiver; import polyglot.ast.Stmt; +import polyglot.ast.TypeNode; import polyglot.frontend.Job; import polyglot.types.QName; +import polyglot.types.Ref; import polyglot.types.SemanticException; import polyglot.types.Type; import polyglot.types.TypeSystem; @@ -38,12 +41,14 @@ import x10.ast.X10Call; import x10.ast.X10NodeFactory; import x10.ast.X10Return_c; +import x10.emitter.Emitter; import x10.types.ParameterType; import x10.types.X10ClassType; import x10.types.X10ParsedClassType_c; import x10.types.X10TypeMixin; import x10.types.X10TypeSystem; import x10.types.constraints.SubtypeConstraint; +import x10.visit.X10PrettyPrinterVisitor; // add cast node for java code generator public class JavaCaster extends ContextVisitor { @@ -73,9 +78,44 @@ protected Node leaveCall(Node parent, Node old, Node n, NodeVisitor v) throws SemanticException { n = typeConstraintsCast(parent, old, n); n = railAccessCast(parent, n); + if (X10PrettyPrinterVisitor.isSelfDispatch) { + n = typeParamCast(parent, n); + } return n; } + private Node typeParamCast(Node parent, Node n) throws SemanticException { + if (n instanceof X10Call && !(parent instanceof Eval)) { + X10Call call = (X10Call) n; + Receiver target = call.target(); + if (!(target instanceof TypeNode) && !xts.isRail(call.target().type())) { + Type bt = X10TypeMixin.baseType(target.type()); + if (bt instanceof X10ClassType) { + if (((X10ClassType) bt).typeArguments().size() > 0) { + boolean isDispatch = false; + if (((X10ClassType) bt).flags().isInterface()) { + List<Ref<? extends Type>> formalTypes = call.methodInstance().def().formalTypes(); + for (Ref<? extends Type> ref : formalTypes) { + Type type = ref.get(); + if (Emitter.containsTypeParam(type)) { + isDispatch = true; + break; + } + } + } + if (isDispatch) { + return cast(call, call.type()); + } + else if (Emitter.containsTypeParam(call.methodInstance().def().returnType().get())) { + return cast(call, call.type()); + } + } + } + } + } + return n; + } + private Node railAccessCast(Node parent, Node n) throws SemanticException { if (n instanceof X10Call) { X10Call call = (X10Call) n; Modified: trunk/x10.runtime/src-java/x10/core/AnyRail.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/AnyRail.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/AnyRail.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -11,7 +11,7 @@ package x10.core; -public interface AnyRail<T> extends Indexable<Integer,T>, Iterable<T> { +public interface AnyRail<T> extends x10.lang.Indexable<Integer,T>, x10.lang.Iterable<T> { // Methods to get the backing array. May be called by generated code. public Object getBackingArray(); Modified: trunk/x10.runtime/src-java/x10/core/GrowableRail.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/GrowableRail.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/GrowableRail.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -14,12 +14,12 @@ import x10.rtt.ParameterizedType; import x10.rtt.RuntimeType; +import x10.rtt.RuntimeType.Variance; import x10.rtt.Type; import x10.rtt.Types; import x10.rtt.UnresolvedType; -import x10.rtt.RuntimeType.Variance; -public final class GrowableRail<T> extends Ref implements Indexable<Integer,T>, Iterable<T>, Settable<Integer, T> { +public final class GrowableRail<T> extends Ref implements x10.lang.Indexable<Integer,T>, x10.lang.Iterable<T>, x10.lang.Settable<Integer, T> { private Type<T> elementType; private Object array; private int length; @@ -46,7 +46,7 @@ this.length = 0; } - public T set$G(T v, Integer i) { + public T set(T v, Type t1, Integer i, Type t2) { return set$G(v, (int)i); } @@ -104,11 +104,11 @@ return RailFactory.makeValRailFromJavaArray(elementType, tmp); } - public Iterator<T> iterator() { + public x10.lang.Iterator<T> iterator() { return new RailIterator(); } - protected class RailIterator implements Iterator<T> { + protected class RailIterator implements x10.lang.Iterator<T> { int i = 0; public boolean hasNext() { @@ -141,8 +141,8 @@ array = tmp; } - public T apply$G(Integer i) { - return apply$G((int)i); + public T apply(Object i, Type t) { + return apply$G((int)(Integer)i); } public T apply$G(int i) { /* @@ -180,9 +180,9 @@ GrowableRail.class, new Variance[] {Variance.INVARIANT}, new Type<?>[] { - new ParameterizedType(Indexable._RTT, Types.INT, new UnresolvedType(0)), - new ParameterizedType(Iterable._RTT, new UnresolvedType(0)), - new ParameterizedType(Settable._RTT, Types.INT, new UnresolvedType(0)) + new ParameterizedType(x10.lang.Indexable._RTT, Types.INT, new UnresolvedType(0)), + new ParameterizedType(x10.lang.Iterable._RTT, new UnresolvedType(0)), + new ParameterizedType(x10.lang.Settable._RTT, Types.INT, new UnresolvedType(0)) } ) { @Override Deleted: trunk/x10.runtime/src-java/x10/core/Indexable.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/Indexable.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/Indexable.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -1,36 +0,0 @@ -/* - * This file is part of the X10 project (http://x10-lang.org). - * - * This file is licensed to You under the Eclipse Public License (EPL); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.opensource.org/licenses/eclipse-1.0.php - * - * (C) Copyright IBM Corporation 2006-2010. - */ - -package x10.core; - -import x10.core.fun.Fun_0_1; -import x10.rtt.ParameterizedType; -import x10.rtt.RuntimeType; -import x10.rtt.Type; -import x10.rtt.UnresolvedType; -import x10.rtt.RuntimeType.Variance; - -public interface Indexable<D,R> extends Fun_0_1<D,R> { - - public static final RuntimeType<Indexable<?,?>> _RTT = new RuntimeType<Indexable<?,?>>( - Indexable.class, - new Variance[] {Variance.CONTRAVARIANT, Variance.COVARIANT}, - new Type<?>[] { - new ParameterizedType(Fun_0_1._RTT, new UnresolvedType(0), new UnresolvedType(1)) - } - ) { - @Override - public String typeName() { - return "x10.lang.Indexable"; - } - }; - -} Deleted: trunk/x10.runtime/src-java/x10/core/Iterable.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/Iterable.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/Iterable.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -1,30 +0,0 @@ -/* - * This file is part of the X10 project (http://x10-lang.org). - * - * This file is licensed to You under the Eclipse Public License (EPL); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.opensource.org/licenses/eclipse-1.0.php - * - * (C) Copyright IBM Corporation 2006-2010. - */ - -package x10.core; - -import x10.rtt.RuntimeType; -import x10.rtt.RuntimeType.Variance; - -public interface Iterable<T> { - Iterator<T> iterator(); - - public static final RuntimeType<Iterable<?>> _RTT = new RuntimeType<Iterable<?>>( - Iterable.class, - new Variance[] {Variance.COVARIANT} - ) { - @Override - public String typeName() { - return "x10.lang.Iterable"; - } - }; - -} Deleted: trunk/x10.runtime/src-java/x10/core/Iterator.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/Iterator.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/Iterator.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -1,31 +0,0 @@ -/* - * This file is part of the X10 project (http://x10-lang.org). - * - * This file is licensed to You under the Eclipse Public License (EPL); - * You may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * http://www.opensource.org/licenses/eclipse-1.0.php - * - * (C) Copyright IBM Corporation 2006-2010. - */ - -package x10.core; - -import x10.rtt.RuntimeType; -import x10.rtt.RuntimeType.Variance; - -/** Just like java.util.Iterator, but without remove(). */ -public interface Iterator<T> { - public boolean hasNext(); - public T next$G(); - - public static final RuntimeType<Iterator<?>> _RTT = new RuntimeType<Iterator<?>>( - Iterator.class, - new Variance[] {Variance.COVARIANT} - ) { - @Override - public String typeName() { - return "x10.lang.Iterator"; - } - }; -} Modified: trunk/x10.runtime/src-java/x10/core/Rail.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/Rail.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/Rail.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -21,7 +21,7 @@ import x10.rtt.UnresolvedType; import x10.rtt.RuntimeType.Variance; -public final class Rail<T> extends Ref implements AnyRail<T>, Settable<Integer,T> { +public final class Rail<T> extends Ref implements AnyRail<T>, x10.lang.Settable<Integer,T> { public final int length; public final Object value; @@ -49,11 +49,11 @@ System.arraycopy(src.value, src_off, value, dst_off, len); } - public Iterator<T> iterator() { + public x10.lang.Iterator<T> iterator() { return new RailIterator(); } - protected class RailIterator implements Iterator<T> { + protected class RailIterator implements x10.lang.Iterator<T> { int i = 0; public boolean hasNext() { @@ -126,8 +126,8 @@ return length; } - public T apply$G(Integer i) { - return apply$G((int)i); + public T apply(Object i, Type t) { + return apply$G((int)(Integer)i); } public T apply$G(int i) { @@ -158,7 +158,7 @@ return sb.toString(); } - public T set$G(T v, Integer i) { + public T set(T v, Type t1, Integer i, Type t2) { return set$G(v, (int)i); } @@ -172,7 +172,7 @@ public void reset(Fun_0_1<Integer,T> v) { for (int i=0; i<length; i++) { - set$G(v.apply$G(i), i); + set$G(v.apply(i, Types.INT), i); } } @@ -210,9 +210,9 @@ Rail.class, new Variance[] {Variance.INVARIANT}, new Type<?>[] { - new ParameterizedType(Indexable._RTT, Types.INT, new UnresolvedType(0)), - new ParameterizedType(Iterable._RTT, new UnresolvedType(0)), - new ParameterizedType(Settable._RTT, Types.INT, new UnresolvedType(0)) + new ParameterizedType(x10.lang.Indexable._RTT, Types.INT, new UnresolvedType(0)), + new ParameterizedType(x10.lang.Iterable._RTT, new UnresolvedType(0)), + new ParameterizedType(x10.lang.Settable._RTT, Types.INT, new UnresolvedType(0)) } ) { @Override Modified: trunk/x10.runtime/src-java/x10/core/RailFactory.java =================================================================== --- trunk/x10.runtime/src-java/x10/core/RailFactory.java 2010-09-22 04:24:05 UTC (rev 16616) +++ trunk/x10.runtime/src-java/x10/core/RailFactory.java 2010-09-22 06:13:21 UTC (rev 16617) @@ -120,47 +120,47 @@ if (value instanceof int[]) { int[] typed_value = (int[]) value; for (int i = 0; i < typed_value.length; i++) { - typed_value[i] = (Integer) init.apply$G(i); + typed_value[i] = (Integer) init.apply(i, Types.INT); } } else if (value instanceof long[]) { long[] typed_value = (long[]) value; for (int i = 0; i < typed_value.length; i++) { - typed_value[i] = (Long) init.apply$G(i); + typed_value[i] = (Long) init.apply(i, Types.INT); } } else if (value instanceof float[]) { float[] typed_value = (float[]) value; for (int i = 0; i < typed_value.length; i++) { - typed_value[i] = (Float) init.apply$G(i); + typed_value[i] = (Float) init.apply(i, Types.INT); } } else if (value instanceof double[]) { double[] typed_value = (double[]) value; for (int i = 0; i < typed_value.length; i++) { - typed_value[i] = (Double) init.apply$G(i); + typed_value[i] = (Double) init.apply(i, Types.INT); } } else if (value instanceof byte[]) { byte[] typed_value = (byte[]) value; for (int i = 0; i < typed_value.length; i++) { - typed_value[i] = (Byte) i... [truncated message content] |