| 1 | //static final Map<Class, HashMap<S, Field>> getOpt_cache = newDangerousWeakHashMap(f getOpt_special_init); | 
| 2 | |
| 3 | sclass getOpt_Map extends WeakHashMap {
 | 
| 4 |   *() {
 | 
| 5 | if (getOpt_special == null) getOpt_special = new HashMap; | 
| 6 | clear(); | 
| 7 | } | 
| 8 | |
| 9 |   public void clear() {
 | 
| 10 | super.clear(); | 
| 11 |     //print("getOpt clear");
 | 
| 12 | put(Class.class, getOpt_special); | 
| 13 | put(S.class, getOpt_special); | 
| 14 | } | 
| 15 | } | 
| 16 | |
| 17 | static final Map<Class, HashMap<S, Field>> getOpt_cache = | 
| 18 | ifdef AssumeNoClassUnloading | 
| 19 | syncHashMap(); | 
| 20 | endifdef | 
| 21 | ifndef AssumeNoClassUnloading | 
| 22 | _registerDangerousWeakMap(synchroMap(new getOpt_Map)); | 
| 23 | endifndef | 
| 24 | |
| 25 | static HashMap getOpt_special; // just a marker | 
| 26 | |
| 27 | /*static void getOpt_special_init(Map map) {
 | 
| 28 | map.put(Class.class, getOpt_special); | 
| 29 | map.put(S.class, getOpt_special); | 
| 30 | }*/ | 
| 31 | |
| 32 | static Map<S, Field> getOpt_getFieldMap(O o) {
 | 
| 33 | Class c = _getClass(o); | 
| 34 | HashMap<S, Field> map = getOpt_cache.get(c); | 
| 35 | if (map == null) | 
| 36 | map = getOpt_makeCache(c); | 
| 37 | ret map; | 
| 38 | } | 
| 39 | |
| 40 | static Object getOpt_cached(Object o, String field) ctex {
 | 
| 41 | if (o == null) ret null; | 
| 42 | |
| 43 | Map<S, Field> map = getOpt_getFieldMap(o); | 
| 44 | |
| 45 |   if (map == getOpt_special) {
 | 
| 46 | if (o instanceof Class) | 
| 47 | return getOpt((Class) o, field); | 
| 48 | /*if (o instanceof S) | 
| 49 | ret getOpt(getBot((S) o), field);*/ | 
| 50 | if (o instanceof Map) | 
| 51 | ret ((Map) o).get(field); | 
| 52 | } | 
| 53 | |
| 54 | Field f = map.get(field); | 
| 55 | if (f != null) ret f.get(o); | 
| 56 | ifclass DynamicObject | 
| 57 | if (o instanceof DynamicObject) | 
| 58 | ret syncMapGet2(((DynamicObject) o).fieldValues, field); | 
| 59 | endif | 
| 60 | ret null; | 
| 61 | } | 
| 62 | |
| 63 | // used internally - we are in synchronized block | 
| 64 | static HashMap<S, Field> getOpt_makeCache(Class c) {
 | 
| 65 | HashMap<S, Field> map; | 
| 66 | if (isSubtypeOf(c, Map.class)) | 
| 67 | map = getOpt_special; | 
| 68 |   else {
 | 
| 69 | map = new HashMap; | 
| 70 | new HashSet<Class> interfaces; | 
| 71 |     if (!reflection_classesNotToScan().contains(c.getName())) {
 | 
| 72 | Class _c = c; | 
| 73 |       do {
 | 
| 74 |         for (Field f : _c.getDeclaredFields()) {
 | 
| 75 | makeAccessible(f); | 
| 76 | S name = f.getName(); | 
| 77 | if (!map.containsKey(name)) | 
| 78 | map.put(name, f); | 
| 79 | } | 
| 80 | for (intf : c.getInterfaces()) | 
| 81 | interfaces.add(intf); | 
| 82 | _c = _c.getSuperclass(); | 
| 83 | } while (_c != null); | 
| 84 | |
| 85 | // Scan interfaces for static final fields | 
| 86 | |
| 87 |       for (intf : interfaces) {
 | 
| 88 |         for (Field f : intf.getDeclaredFields()) {
 | 
| 89 | makeAccessible(f); | 
| 90 | S name = f.getName(); | 
| 91 | if (!map.containsKey(name)) | 
| 92 | map.put(name, f); | 
| 93 | } | 
| 94 | } | 
| 95 | } | 
| 96 | } | 
| 97 | |
| 98 | if (getOpt_cache != null) getOpt_cache.put(c, map); | 
| 99 | ret map; | 
| 100 | } | 
Began life as a copy of #1005583
download show line numbers debug dex old transpilations
Travelled to 2 computer(s): mqqgnosmbjvj, wnsclhtenguj
No comments. add comment
| Snippet ID: | #1036538 | 
| Snippet name: | getOpt_cached (branch with scanning interfaces for fields) | 
| Eternal ID of this version: | #1036538/1 | 
| Text MD5: | 52bdf71247db905c8999da3b789d70cf | 
| Author: | stefan | 
| Category: | javax | 
| Type: | JavaX fragment (include) | 
| Public (visible to everyone): | Yes | 
| Archived (hidden from active list): | No | 
| Created/modified: | 2023-01-31 19:44:48 | 
| Source code size: | 2686 bytes / 100 lines | 
| Pitched / IR pitched: | No / No | 
| Views / Downloads: | 515 / 497 | 
| Referenced in: | [show references] |