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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
13 import java.util.Map;
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
25 import goodjava.io.BufferedInputStream;
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
26 import goodjava.io.DataInputStream;
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
35 private static class MyJavaFileObject extends SimpleJavaFileObject {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
36 final ByteArrayOutputStream baos = new ByteArrayOutputStream();
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
37
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
38 MyJavaFileObject() {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
39 super(URI.create("whatever"),JavaFileObject.Kind.CLASS);
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
40 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
41
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
42 @Override public OutputStream openOutputStream() {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
43 return baos;
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
44 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
45
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
46 byte[] byteCode(String sourceName) {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
47 byte[] byteCode = baos.toByteArray();
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
48 final int len = sourceName.length();
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
49 int max = byteCode.length-len-3;
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
50 outer:
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
51 for( int i=0; true; i++ ) {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
52 if( i > max )
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
53 throw new RuntimeException("len="+len);
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
54 if( byteCode[i]==1 && (byteCode[i+1] << 8 | 0xFF & byteCode[i+2]) == len ) {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
55 for( int j=i+3; j<i+3+len; j++ ) {
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
56 if( byteCode[j] != '$' )
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
57 continue outer;
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
58 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
59 System.arraycopy(sourceName.getBytes(),0,byteCode,i+3,len);
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
60 break;
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
61 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
62 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
63 return byteCode;
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
64 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
65 }
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
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
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
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
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
88 if( map.containsKey(className) )
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
89 throw new RuntimeException(className);
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
90 MyJavaFileObject classFile = new MyJavaFileObject();
41f8fdbc3a0a compile modules
Franklin Schmidt <fschmidt@gmail.com>
parents: 658
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
130 } catch(ClassNotFoundException e) {
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
131 throw new RuntimeException(e);
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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
aaac1d29edea better io
Franklin Schmidt <fschmidt@gmail.com>
parents: 1436
diff changeset
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 }