| @@ -21,6 +21,9 @@ include "math.m"; · 20 unmodified lines |
| 21 | include "hash.m"; | 21 | include "hash.m"; |
| 22 | hash: Hash; | 22 | hash: Hash; |
| 23 | | 23 | |
| | 24 | include "sh.m"; |
| | 25 | sh: Sh; |
| | 26 | |
| 24 | include "loader.m"; | 27 | include "loader.m"; |
| 25 | include "classloader.m"; | 28 | include "classloader.m"; |
| 26 | ld: Loader; | 29 | ld: Loader; |
| @@ -83,6 +86,9 @@ debug: int = 0; · 56 unmodified lines |
| 83 | verbose: int = 0; | 86 | verbose: int = 0; |
| 84 | errors: int = 0; | 87 | errors: int = 0; |
| 85 | | 88 | |
| | 89 | autotranslate := 0; |
| | 90 | sysautotranslate := 0; |
| | 91 | |
| 86 | # for generating ClassLoader exceptions use | 92 | # for generating ClassLoader exceptions use |
| 87 | # the following con's. They will be turned | 93 | # the following con's. They will be turned |
| 88 | # into a corresponding Java Exception by | 94 | # into a corresponding Java Exception by |
| @@ -1841,6 +1847,47 @@ Class.clone(c: self ref Class, o: ref Object): ref Object · 1752 unmodified lines |
| 1841 | # Class private methods. | 1847 | # Class private methods. |
| 1842 | # | 1848 | # |
| 1843 | | 1849 | |
| | 1850 | # |
| | 1851 | # Autotranslation |
| | 1852 | # |
| | 1853 | classfilepath(path: string): string |
| | 1854 | { |
| | 1855 | extlen := len ".dis"; |
| | 1856 | if (len path <= extlen) |
| | 1857 | return ""; |
| | 1858 | return path[:len path - extlen] + ".class"; |
| | 1859 | } |
| | 1860 | needtranslate(disfilepath: string, classfilepath: string): int |
| | 1861 | { |
| | 1862 | (derr, ddir) := sys->stat(disfilepath); |
| | 1863 | if (derr < 0) |
| | 1864 | return 1; |
| | 1865 | (cerr, cdir) := sys->stat(classfilepath); |
| | 1866 | if (cerr < 0) |
| | 1867 | return 0; |
| | 1868 | |
| | 1869 | return ddir.mtime < cdir.mtime; |
| | 1870 | } |
| | 1871 | translate(path: string) |
| | 1872 | { |
| | 1873 | classfilepath := classfilepath(path); |
| | 1874 | if (sys->open(classfilepath, Sys->OREAD) == nil) |
| | 1875 | return; |
| | 1876 | if (!needtranslate(path, classfilepath)) |
| | 1877 | return; |
| | 1878 | |
| | 1879 | if (sh == nil) { |
| | 1880 | sh = load Sh Sh->PATH; |
| | 1881 | if (sh == nil) |
| | 1882 | error(sys->sprint("could not load %s: %r", Sh->PATH)); |
| | 1883 | } |
| | 1884 | |
| | 1885 | trace(JVERBOSE, sys->sprint("Autotranslate: calling j2d for %s", classfilepath)); |
| | 1886 | result := sh->run(nil, "java/j2d" :: "-g" :: "-o" :: path :: classfilepath :: nil); |
| | 1887 | if (result != "") |
| | 1888 | loaderror(classformat, result + ": " + path); |
| | 1889 | } |
| | 1890 | |
| 1844 | # | 1891 | # |
| 1845 | # Load a class file. | 1892 | # Load a class file. |
| 1846 | # | 1893 | # |
| @@ -1848,12 +1895,16 @@ Class.loadclass(c: self ref Class) · 1 unmodified line |
| 1848 | { | 1895 | { |
| 1849 | c.encoding = encodename(c.name); | 1896 | c.encoding = encodename(c.name); |
| 1850 | f := c.encoding + ".dis"; | 1897 | f := c.encoding + ".dis"; |
| | 1898 | if (autotranslate) |
| | 1899 | translate(f); |
| 1851 | m := load Nilmod f; | 1900 | m := load Nilmod f; |
| 1852 | if (m == nil) { | 1901 | if (m == nil) { |
| 1853 | e := sys->sprint("%r"); | 1902 | e := sys->sprint("%r"); |
| 1854 | if (!matches(e, EXIST)) | 1903 | if (!matches(e, EXIST)) |
| 1855 | error(f + ": " + e); | 1904 | error(f + ": " + e); |
| 1856 | f = ROOT + f; | 1905 | f = ROOT + f; |
| | 1906 | if (autotranslate) |
| | 1907 | translate(f); |
| 1857 | m = load Nilmod f; | 1908 | m = load Nilmod f; |
| 1858 | if (m == nil) { | 1909 | if (m == nil) { |
| 1859 | e = sys->sprint("%r"); | 1910 | e = sys->sprint("%r"); |
| @@ -3495,8 +3546,9 @@ setflags( flags : list of (string,int) ) · 1635 unmodified lines |
| 3495 | { | 3546 | { |
| 3496 | if ( flags == nil ) return; | 3547 | if ( flags == nil ) return; |
| 3497 | | 3548 | |
| 3498 | for((f,v):=hd flags; flags != nil; flags = tl flags ) | 3549 | for(; flags != nil; flags = tl flags ) |
| 3499 | { | 3550 | { |
| | 3551 | (f, v) := hd flags; |
| 3500 | case (f) | 3552 | case (f) |
| 3501 | { | 3553 | { |
| 3502 | "debug" => loadtrace(); | 3554 | "debug" => loadtrace(); |
| @@ -3504,6 +3556,7 @@ setflags( flags : list of (string,int) ) · 1 unmodified line |
| 3504 | "verbose" => loadtrace(); | 3556 | "verbose" => loadtrace(); |
| 3505 | jtrace->level = JVERBOSE; | 3557 | jtrace->level = JVERBOSE; |
| 3506 | "warn" => warn = v; | 3558 | "warn" => warn = v; |
| | 3559 | "autotranslate" => autotranslate = 1; |
| 3507 | } | 3560 | } |
| 3508 | } | 3561 | } |
| 3509 | } | 3562 | } |