Libraryless. Click here for Pure Java version (4237L/27K/92K).
1 | !752 |
2 | |
3 | static int maxObjects = 1000; |
4 | |
5 | concepts. |
6 | |
7 | concept Obj { |
8 | O o; |
9 | |
10 | *() {} |
11 | *(O *o) { change(); } |
12 | } |
13 | |
14 | concept Function { |
15 | S name; |
16 | bool nonDet; |
17 | |
18 | *() {} |
19 | *(S *name) { change(); } |
20 | } |
21 | |
22 | concept Result { |
23 | new Ref<Function> f; |
24 | new Ref<Obj> argument; |
25 | new Ref<Obj> result; |
26 | PersistableThrowable error; |
27 | long when, time; |
28 | } |
29 | |
30 | Result > Application {} |
31 | |
32 | Result > PreviousResult {} |
33 | |
34 | static L<File> f_listFiles(File dir) { |
35 | ret asList(listFiles(dir)); |
36 | } |
37 | |
38 | static long f_fileSize(File f) { |
39 | ret f.length(); |
40 | } |
41 | |
42 | static L<S> safeFunctionsToTry = ll("f_listFiles", "f_fileSize"); |
43 | |
44 | static new LinkedHashSet roots; |
45 | |
46 | p { |
47 | concepts(); |
48 | |
49 | addStuff(javaxDataDir()); |
50 | addStuff(userHome()); |
51 | |
52 | for (S name : safeFunctionsToTry) uniq(Function, +name); |
53 | |
54 | int lastN = -1; |
55 | while licensed { |
56 | int n = countConcepts(Obj); |
57 | if (n == lastN) { |
58 | print("No new objects (have " + n + "), ending"); |
59 | break; |
60 | } |
61 | lastN = n; |
62 | if (n >= maxObjects) { |
63 | print("Got more than " + maxObjects + " objects (" + n + "), stopping"); |
64 | break; |
65 | } |
66 | tryStuffOnStuff(true); |
67 | } |
68 | } |
69 | |
70 | svoid tryStuffOnStuff(bool reapply) { |
71 | for (Obj o) |
72 | unpackStuff(o.o); |
73 | |
74 | for (Function f) { |
75 | Method m = findMethodNamed(mc(), f.name); |
76 | Class<?>[] types = m.getParameterTypes(); |
77 | if (l(types) == 1) { |
78 | for (Obj argument : list(Obj)) { |
79 | Application app = findConcept(Application, +f, +argument); |
80 | if (!reapply && app != null) continue; |
81 | O o = argument.o; |
82 | if (isInstanceX(types[0], o)) { |
83 | print("Calling " + f.name + " on object " + argument.id); |
84 | long time = now(); |
85 | O out = null; |
86 | Throwable error = null; |
87 | try { |
88 | out = m.invoke(null, o); |
89 | } catch e { |
90 | error = e; |
91 | } |
92 | time = now()-time; |
93 | Obj result = findConcept(Obj, o := out); |
94 | bool seen = result != null; |
95 | if (result == null) |
96 | result = cnew(Obj, o := out); |
97 | |
98 | // have previous result? |
99 | bool prevResult = app != null; |
100 | if (prevResult) { |
101 | if (neq(app.result!, result)) { |
102 | print(" differs"); |
103 | // Save previous result |
104 | cnew(PreviousResult, +f, +argument, result := app.result, error := app.error, when := app.when, time := app.time); |
105 | // Mark function non-deterministic |
106 | cset(f, nonDet := true); |
107 | } |
108 | } else |
109 | app = cnew(Application, +f, +argument); |
110 | cset(app, +result, when := now(), +time, error := persistableThrowable(error)); |
111 | if (!prevResult) |
112 | print(error != null ? " error" : seen ? " seen" : " new"); |
113 | } |
114 | } |
115 | } |
116 | } |
117 | } |
118 | |
119 | svoid addStuff(O o) { |
120 | if (o == null) ret; |
121 | if (!hasConcept(Obj, +o)) { |
122 | cnew(Obj, +o); |
123 | print("Got: " + struct(o)); |
124 | } |
125 | } |
126 | |
127 | svoid unpackStuff(O o) { |
128 | if (o instanceof ArrayList) |
129 | for (O x : (Collection) o) |
130 | addStuff(x); |
131 | } |
Began life as a copy of #1005771
download show line numbers debug dex old transpilations
Travelled to 14 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, sawdedvomwva, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1005772 |
Snippet name: | Try stuff on stuff 2 [works] |
Eternal ID of this version: | #1005772/1 |
Text MD5: | a9427af720147607d9f67127eff548f6 |
Transpilation MD5: | cf9ccab4076abda61b3d1a9c17254dc9 |
Author: | stefan |
Category: | javax |
Type: | JavaX source code |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2016-12-08 03:24:10 |
Source code size: | 3101 bytes / 131 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 657 / 767 |
Referenced in: | [show references] |