Source code: ClassLib/ibm13_linux/Interface.java
1 // Interface.java, created Fri Jan 11 17:07:15 2002 by joewhaley
2 // Copyright (C) 2001-3 John Whaley <jwhaley@alum.mit.edu>
3 // Licensed under the terms of the GNU LGPL; see COPYING for details.
4 package ClassLib.ibm13_linux;
5
6 import java.util.Iterator;
7
8 import Bootstrap.ObjectTraverser;
9 import Bootstrap.PrimordialClassLoader;
10 import ClassLib.ClassLibInterface;
11 import Clazz.jq_Class;
12 import Main.jq;
13
14 /**
15 * Interface
16 *
17 * @author John Whaley <jwhaley@alum.mit.edu>
18 * @version $Id: Interface.java,v 1.25 2003/05/12 10:04:54 joewhaley Exp $
19 */
20 public final class Interface extends ClassLib.Common.InterfaceImpl {
21
22 /** Creates new Interface */
23 public Interface() {}
24
25 public Iterator getImplementationClassDescs(UTF.Utf8 desc) {
26 if (ClassLibInterface.USE_JOEQ_CLASSLIB && (desc.toString().startsWith("Ljava/") ||
27 desc.toString().startsWith("Lcom/ibm/jvm/"))) {
28 UTF.Utf8 u = UTF.Utf8.get("LClassLib/ibm13_linux/"+desc.toString().substring(1));
29 return new Util.Collections.AppendIterator(super.getImplementationClassDescs(desc),
30 java.util.Collections.singleton(u).iterator());
31 }
32 return super.getImplementationClassDescs(desc);
33 }
34
35 public ObjectTraverser getObjectTraverser() {
36 return ibm13_linuxObjectTraverser.INSTANCE;
37 }
38
39 public static class ibm13_linuxObjectTraverser extends CommonObjectTraverser {
40 public static ibm13_linuxObjectTraverser INSTANCE = new ibm13_linuxObjectTraverser();
41 protected ibm13_linuxObjectTraverser() {}
42 public void initialize() {
43 super.initialize();
44
45 // access the ISO-8859-1 character encoding, as it is used during bootstrapping
46 try {
47 String s = new String(new byte[0], 0, 0, "ISO-8859-1");
48 } catch (java.io.UnsupportedEncodingException x) {}
49 PrimordialClassLoader.loader.getOrCreateBSType("Lsun/io/CharToByteISO8859_1;");
50
51 jq_Class k = (jq_Class)PrimordialClassLoader.loader.getOrCreateBSType("Ljava/net/URLClassLoader$ClassFinder;");
52 nullInstanceFields.add(k.getOrCreateInstanceField("name", "Ljava/lang/String;"));
53
54 k = (jq_Class)PrimordialClassLoader.loader.getOrCreateBSType("Lsun/misc/Launcher;");
55 nullStaticFields.add(k.getOrCreateStaticField("launcher", "Lsun/misc/Launcher;"));
56 //k = (jq_Class)PrimordialClassLoader.loader.getOrCreateBSType("Ljava/net/URLClassLoader;");
57 //nullStaticFields.add(k.getOrCreateStaticField("extLoader", "Ljava/net/URLClassLoader;"));
58 k = PrimordialClassLoader.getJavaLangString();
59 nullStaticFields.add(k.getOrCreateStaticField("btcConverter", "Ljava/lang/ThreadLocal;"));
60 nullStaticFields.add(k.getOrCreateStaticField("ctbConverter", "Ljava/lang/ThreadLocal;"));
61 k = (jq_Class)PrimordialClassLoader.loader.getOrCreateBSType("Ljava/util/zip/ZipFile;");
62 nullStaticFields.add(k.getOrCreateStaticField("inflaters", "Ljava/util/Vector;"));
63
64 // we need to reinitialize the inflaters array on startup.
65 if (jq.on_vm_startup != null) {
66 Object[] args = { } ;
67 Clazz.jq_Method init_inflaters = k.getOrCreateStaticMethod("init_inflaters", "()V");
68 Bootstrap.MethodInvocation mi = new Bootstrap.MethodInvocation(init_inflaters, args);
69 jq.on_vm_startup.add(mi);
70 System.out.println("Added call to reinitialize java.util.zip.ZipFile.inflaters field on joeq startup: "+mi);
71 }
72 }
73
74 public java.lang.Object mapInstanceField(java.lang.Object o, Clazz.jq_InstanceField f) {
75 if (IGNORE_THREAD_LOCALS) {
76 jq_Class c = f.getDeclaringClass();
77 if (c == PrimordialClassLoader.getJavaLangThread()) {
78 String fieldName = f.getName().toString();
79 if (fieldName.equals("threadLocals"))
80 return java.util.Collections.EMPTY_MAP;
81 if (fieldName.equals("inheritableThreadLocals"))
82 return java.util.Collections.EMPTY_MAP;
83 }
84 }
85 return super.mapInstanceField(o, f);
86 }
87 }
88 }