1881 |
1881 |
1882 /** |
1882 /** |
1883 * Translate a symbol of a given kind into something suitable for the |
1883 * Translate a symbol of a given kind into something suitable for the |
1884 * synthetic lambda body |
1884 * synthetic lambda body |
1885 */ |
1885 */ |
1886 Symbol translate(Name name, final Symbol sym, LambdaSymbolKind skind) { |
1886 Symbol translate(final Symbol sym, LambdaSymbolKind skind) { |
1887 Symbol ret; |
1887 Symbol ret; |
1888 switch (skind) { |
1888 switch (skind) { |
1889 case CAPTURED_THIS: |
1889 case CAPTURED_THIS: |
1890 ret = sym; // self represented |
1890 ret = sym; // self represented |
1891 break; |
1891 break; |
1892 case TYPE_VAR: |
1892 case TYPE_VAR: |
1893 // Just erase the type var |
1893 // Just erase the type var |
1894 ret = new VarSymbol(sym.flags(), name, |
1894 ret = new VarSymbol(sym.flags(), sym.name, |
1895 types.erasure(sym.type), sym.owner); |
1895 types.erasure(sym.type), sym.owner); |
1896 |
1896 |
1897 /* this information should also be kept for LVT generation at Gen |
1897 /* this information should also be kept for LVT generation at Gen |
1898 * a Symbol with pos < startPos won't be tracked. |
1898 * a Symbol with pos < startPos won't be tracked. |
1899 */ |
1899 */ |
1900 ((VarSymbol)ret).pos = ((VarSymbol)sym).pos; |
1900 ((VarSymbol)ret).pos = ((VarSymbol)sym).pos; |
1901 break; |
1901 break; |
1902 case CAPTURED_VAR: |
1902 case CAPTURED_VAR: |
1903 ret = new VarSymbol(SYNTHETIC | FINAL | PARAMETER, name, types.erasure(sym.type), translatedSym) { |
1903 ret = new VarSymbol(SYNTHETIC | FINAL | PARAMETER, sym.name, types.erasure(sym.type), translatedSym) { |
1904 @Override |
1904 @Override |
1905 public Symbol baseSymbol() { |
1905 public Symbol baseSymbol() { |
1906 //keep mapping with original captured symbol |
1906 //keep mapping with original captured symbol |
1907 return sym; |
1907 return sym; |
1908 } |
1908 } |
1909 }; |
1909 }; |
1910 break; |
1910 break; |
1911 case LOCAL_VAR: |
1911 case LOCAL_VAR: |
1912 ret = new VarSymbol(sym.flags() & FINAL, name, sym.type, translatedSym); |
1912 ret = new VarSymbol(sym.flags() & FINAL, sym.name, sym.type, translatedSym); |
1913 ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; |
1913 ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; |
1914 break; |
1914 break; |
1915 case PARAM: |
1915 case PARAM: |
1916 ret = new VarSymbol((sym.flags() & FINAL) | PARAMETER, name, types.erasure(sym.type), translatedSym); |
1916 ret = new VarSymbol((sym.flags() & FINAL) | PARAMETER, sym.name, types.erasure(sym.type), translatedSym); |
1917 ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; |
1917 ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; |
1918 break; |
1918 break; |
1919 default: |
1919 default: |
1920 ret = makeSyntheticVar(FINAL, name, types.erasure(sym.type), translatedSym); |
1920 Assert.error(skind.name()); |
1921 ((VarSymbol) ret).pos = ((VarSymbol) sym).pos; |
1921 throw new AssertionError(); |
1922 } |
1922 } |
1923 if (ret != sym) { |
1923 if (ret != sym) { |
1924 ret.setDeclarationAttributes(sym.getRawAttributes()); |
1924 ret.setDeclarationAttributes(sym.getRawAttributes()); |
1925 ret.setTypeAttributes(sym.getRawTypeAttributes()); |
1925 ret.setTypeAttributes(sym.getRawTypeAttributes()); |
1926 } |
1926 } |
1927 return ret; |
1927 return ret; |
1928 } |
1928 } |
1929 |
1929 |
1930 void addSymbol(Symbol sym, LambdaSymbolKind skind) { |
1930 void addSymbol(Symbol sym, LambdaSymbolKind skind) { |
1931 Map<Symbol, Symbol> transMap = getSymbolMap(skind); |
1931 Map<Symbol, Symbol> transMap = getSymbolMap(skind); |
1932 Name preferredName; |
|
1933 switch (skind) { |
|
1934 case CAPTURED_THIS: |
|
1935 preferredName = names.fromString("encl$" + transMap.size()); |
|
1936 break; |
|
1937 case CAPTURED_VAR: |
|
1938 preferredName = names.fromString("cap$" + transMap.size()); |
|
1939 break; |
|
1940 case LOCAL_VAR: |
|
1941 preferredName = sym.name; |
|
1942 break; |
|
1943 case PARAM: |
|
1944 preferredName = sym.name; |
|
1945 break; |
|
1946 case TYPE_VAR: |
|
1947 preferredName = sym.name; |
|
1948 break; |
|
1949 default: throw new AssertionError(); |
|
1950 } |
|
1951 if (!transMap.containsKey(sym)) { |
1932 if (!transMap.containsKey(sym)) { |
1952 transMap.put(sym, translate(preferredName, sym, skind)); |
1933 transMap.put(sym, translate(sym, skind)); |
1953 } |
1934 } |
1954 } |
1935 } |
1955 |
1936 |
1956 Map<Symbol, Symbol> getSymbolMap(LambdaSymbolKind skind) { |
1937 Map<Symbol, Symbol> getSymbolMap(LambdaSymbolKind skind) { |
1957 Map<Symbol, Symbol> m = translatedSymbols.get(skind); |
1938 Map<Symbol, Symbol> m = translatedSymbols.get(skind); |