Mercurial Hosting > luan
annotate src/luan/impl/Compiled.java @ 1563:8fbcc4747091
remove LuanFunction.luan
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 09 Nov 2020 01:37:57 -0700 |
parents | b89212fd04b5 |
children | 2975c932864d |
rev | line source |
---|---|
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
1 package luan.impl; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
2 |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
3 import java.io.OutputStream; |
1492 | 4 import java.io.BufferedOutputStream; |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
5 import java.io.ByteArrayOutputStream; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
6 import java.io.StringWriter; |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
7 import java.io.File; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
8 import java.io.FileInputStream; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
9 import java.io.FileOutputStream; |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
10 import java.io.IOException; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
11 import java.net.URI; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
12 import java.util.Collections; |
665 | 13 import java.util.Map; |
14 import java.util.HashMap; | |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
15 import java.util.Set; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
16 import java.util.HashSet; |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
17 import javax.tools.FileObject; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
18 import javax.tools.JavaFileObject; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
19 import javax.tools.SimpleJavaFileObject; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
20 import javax.tools.JavaCompiler; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
21 import javax.tools.ToolProvider; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
22 import javax.tools.JavaFileManager; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
23 import javax.tools.StandardJavaFileManager; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
24 import javax.tools.ForwardingJavaFileManager; |
1492 | 25 import goodjava.io.BufferedInputStream; |
26 import goodjava.io.DataInputStream; | |
27 import goodjava.io.DataOutputStream; | |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
28 import goodjava.logging.Logger; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
29 import goodjava.logging.LoggerFactory; |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
30 |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
31 |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
32 final class Compiled { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
33 private static final Logger logger = LoggerFactory.getLogger(Compiled.class); |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
34 |
665 | 35 private static class MyJavaFileObject extends SimpleJavaFileObject { |
36 final ByteArrayOutputStream baos = new ByteArrayOutputStream(); | |
37 | |
38 MyJavaFileObject() { | |
39 super(URI.create("whatever"),JavaFileObject.Kind.CLASS); | |
40 } | |
41 | |
42 @Override public OutputStream openOutputStream() { | |
43 return baos; | |
44 } | |
45 | |
46 byte[] byteCode(String sourceName) { | |
47 byte[] byteCode = baos.toByteArray(); | |
48 final int len = sourceName.length(); | |
49 int max = byteCode.length-len-3; | |
50 outer: | |
51 for( int i=0; true; i++ ) { | |
52 if( i > max ) | |
53 throw new RuntimeException("len="+len); | |
54 if( byteCode[i]==1 && (byteCode[i+1] << 8 | 0xFF & byteCode[i+2]) == len ) { | |
55 for( int j=i+3; j<i+3+len; j++ ) { | |
56 if( byteCode[j] != '$' ) | |
57 continue outer; | |
58 } | |
59 System.arraycopy(sourceName.getBytes(),0,byteCode,i+3,len); | |
60 break; | |
61 } | |
62 } | |
63 return byteCode; | |
64 } | |
65 } | |
66 | |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
67 static Compiled compile(final String className,final String sourceName,final String code) { |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
68 final int len = sourceName.length(); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
69 StringBuilder sb = new StringBuilder(sourceName); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
70 for( int i=0; i<len; i++ ) |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
71 sb.setCharAt(i,'$'); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
72 JavaFileObject sourceFile = new SimpleJavaFileObject(URI.create(sb.toString()),JavaFileObject.Kind.SOURCE) { |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
73 @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
74 return code; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
75 } |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
76 @Override public String getName() { |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
77 return sourceName; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
78 } |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
79 @Override public boolean isNameCompatible(String simpleName,JavaFileObject.Kind kind) { |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
80 return true; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
81 } |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
82 }; |
665 | 83 final Map<String,MyJavaFileObject> map = new HashMap<String,MyJavaFileObject>(); |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
84 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
85 StandardJavaFileManager sjfm = compiler.getStandardFileManager(null,null,null); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
86 ForwardingJavaFileManager fjfm = new ForwardingJavaFileManager(sjfm) { |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
87 @Override public JavaFileObject getJavaFileForOutput(JavaFileManager.Location location, String className, JavaFileObject.Kind kind, FileObject sibling) throws IOException { |
665 | 88 if( map.containsKey(className) ) |
89 throw new RuntimeException(className); | |
90 MyJavaFileObject classFile = new MyJavaFileObject(); | |
91 map.put(className,classFile); | |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
92 return classFile; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
93 } |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
94 }; |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
95 StringWriter out = new StringWriter(); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
96 boolean b = compiler.getTask(out, fjfm, null, null, null, Collections.singletonList(sourceFile)).call(); |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
97 if( !b ) |
652
067d9470184d
compile SetStmt and ForStmt
Franklin Schmidt <fschmidt@gmail.com>
parents:
650
diff
changeset
|
98 throw new RuntimeException("\n"+out+"\ncode:\n"+code+"\n"); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
99 Map<String,byte[]> map2 = new HashMap<String,byte[]>(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
100 for( Map.Entry<String,MyJavaFileObject> entry : map.entrySet() ) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
101 map2.put( entry.getKey(), entry.getValue().byteCode(sourceName) ); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
102 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
103 return new Compiled(className,map2); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
104 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
105 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
106 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
107 private final String className; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
108 private final Map<String,byte[]> map; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
109 private final Set<String> set = new HashSet<String>(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
110 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
111 private Compiled(String className,Map<String,byte[]> map) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
112 this.className = className; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
113 this.map = map; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
114 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
115 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
116 Class loadClass() { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
117 try { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
118 ClassLoader cl = new ClassLoader() { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
119 @Override protected Class<?> findClass(String name) throws ClassNotFoundException { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
120 if( !set.add(name) ) |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
121 logger.error("dup "+name); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
122 byte[] byteCode = map.get(name); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
123 if( byteCode != null ) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
124 return defineClass(name, byteCode, 0, byteCode.length); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
125 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
126 return super.findClass(name); |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
127 } |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
128 }; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
129 return cl.loadClass(className); |
1492 | 130 } catch(ClassNotFoundException e) { |
131 throw new RuntimeException(e); | |
132 } | |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
133 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
134 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
135 |
1563
8fbcc4747091
remove LuanFunction.luan
Franklin Schmidt <fschmidt@gmail.com>
parents:
1562
diff
changeset
|
136 private static final int VERSION = 6; |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
137 private static final File tmpDir; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
138 static { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
139 File f = new File(System.getProperty("java.io.tmpdir")); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
140 tmpDir = new File(f,"luan"); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
141 tmpDir.mkdir(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
142 if( !tmpDir.exists() ) |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
143 throw new RuntimeException(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
144 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
145 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
146 static Compiled load(String fileName,String key) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
147 try { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
148 File f = new File(tmpDir,fileName); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
149 if( !f.exists() ) |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
150 return null; |
1492 | 151 DataInputStream in = new DataInputStream(new BufferedInputStream(new FileInputStream(f))); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
152 if( in.readInt() != VERSION ) |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
153 return null; |
1492 | 154 if( !in.readString().equals(key) ) |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
155 return null; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
156 String className = in.readUTF(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
157 int n = in.readInt(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
158 Map<String,byte[]> map = new HashMap<String,byte[]>(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
159 for( int i=0; i<n; i++ ) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
160 String s = in.readUTF(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
161 int len = in.readInt(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
162 byte[] a = new byte[len]; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
163 in.readFully(a); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
164 map.put(s,a); |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
165 } |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
166 in.close(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
167 return new Compiled(className,map); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
168 } catch(IOException e) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
169 logger.error("load failed",e); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
170 return null; |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
171 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
172 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
173 |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
174 void save(String fileName,String key) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
175 try { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
176 File f = new File(tmpDir,fileName); |
1492 | 177 DataOutputStream out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(f))); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
178 out.writeInt(VERSION); |
1492 | 179 out.writeString(key); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
180 out.writeUTF(className); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
181 out.writeInt(map.size()); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
182 for( Map.Entry<String,byte[]> entry : map.entrySet() ) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
183 out.writeUTF( entry.getKey() ); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
184 byte[] a = entry.getValue(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
185 out.writeInt(a.length); |
1492 | 186 out.write(a); |
1434
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
187 } |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
188 out.close(); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
189 } catch(IOException e) { |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
190 logger.error("save failed",e); |
56fb5cd8228d
cache compiled code in temp files
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
191 } |
648
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
192 } |
e387e4021afe
start compiler with len operator
Franklin Schmidt <fschmidt@gmail.com>
parents:
diff
changeset
|
193 } |