Skip to content

Commit b85a8e7

Browse files
author
zhourenjian
committed
Fix bugs that inner classes are not correctly Hotspot-swapped.
Try to evaluate inner or anonymous classes from method body.
1 parent 9f70ee5 commit b85a8e7

File tree

4 files changed

+63
-6
lines changed

4 files changed

+63
-6
lines changed

sources/net.sf.j2s.java.core/src/java/lang/Class.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1087,6 +1087,7 @@ Clazz.formatParameters = function (funParams) {
10871087
*/
10881088
/* public */
10891089
Clazz.overrideMethod = function (clazzThis, funName, funBody, funParams) {
1090+
if (Clazz.assureInnerClass) Clazz.assureInnerClass (clazzThis, funBody);
10901091
funBody.exName = funName;
10911092
var fpName = Clazz.formatParameters (funParams);
10921093
/*
@@ -1111,6 +1112,7 @@ Clazz.overrideMethod = function (clazzThis, funName, funBody, funParams) {
11111112
*/
11121113
/* public */
11131114
Clazz.defineMethod = function (clazzThis, funName, funBody, funParams) {
1115+
if (Clazz.assureInnerClass) Clazz.assureInnerClass (clazzThis, funBody);
11141116
funBody.exName = funName;
11151117
var fpName = Clazz.formatParameters (funParams);
11161118
/*

sources/net.sf.j2s.java.core/src/java/lang/ClassExt.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -845,6 +845,7 @@ Clazz.unloadClass = function (qClazzName) {
845845
// also try to unload inner or anonymous classes
846846
for (var c in window) {
847847
if (c.indexOf (qClazzName + "$") == 0) {
848+
Clazz.unloadClass (c);
848849
window[c] = null;
849850
}
850851
}
@@ -853,6 +854,7 @@ Clazz.unloadClass = function (qClazzName) {
853854
// also try to unload inner or anonymous classes
854855
for (var c in pkg) {
855856
if (c.indexOf (pkgFrags[pkgFrags.length - 1] + "$") == 0) {
857+
Clazz.unloadClass (pkg.__PKG_NAME__ + "." + c);
856858
pkg[c] = null;
857859
}
858860
}

sources/net.sf.j2s.java.core/src/java/lang/ClassLoader.js

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,12 @@ ClazzLoader.scriptInited = function (file) {};
693693
/* protected */
694694
ClazzLoader.scriptCompleted = function (file) {};
695695

696+
/* protected */
697+
ClazzLoader.classUnloaded = function (clazz) {};
698+
699+
/* protected */
700+
ClazzLoader.classReloaded = function (clazz) {};
701+
696702
/**
697703
* After all the classes are loaded, this method will be called.
698704
* Should be overriden to run *.main([]).
@@ -2467,8 +2473,47 @@ ClazzLoader.unloadClassExt = function (qClazzName) {
24672473
ClazzLoader.innerLoadedScripts[path] = false;
24682474
}
24692475

2470-
if (window["ClassLoaderProgressMonitor"] != null) {
2471-
ClassLoaderProgressMonitor.showStatus ("Class " + qClazzName + " is unloaded.", true);
2476+
ClazzLoader.classUnloaded (qClazzName);
2477+
};
2478+
2479+
/* private */
2480+
ClazzLoader.assureInnerClass = function (clzz, fun) {
2481+
var clzzName = clzz.__CLASS_NAME__;
2482+
if (Clazz.unloadedClasses[clzzName]) {
2483+
if (clzzName.indexOf ("$") != -1) return;
2484+
var list = new Array ();
2485+
var key = clzzName + "$";
2486+
for (var s in Clazz.unloadedClasses) {
2487+
if (Clazz.unloadedClasses[s] != null && s.indexOf (key) == 0) {
2488+
list[list.length] = s;
2489+
}
2490+
}
2491+
if (list.length == 0) return;
2492+
var funStr = "" + fun;
2493+
var idx1 = funStr.indexOf (key);
2494+
if (idx1 == -1) return;
2495+
var idx2 = funStr.indexOf ("\"", idx1 + key.length);
2496+
if (idx2 == -1) return; // idx2 should never be -1;
2497+
var anonyClazz = funStr.substring (idx1, idx2);
2498+
if (Clazz.unloadedClasses[anonyClazz] == null) return;
2499+
var idx3 = funStr.indexOf ("{", idx2);
2500+
if (idx3 == -1) return;
2501+
idx3++;
2502+
var idx4 = funStr.indexOf ("(" + anonyClazz + ",", idx3 + 3);
2503+
if (idx4 == -1) return; // idx3 should never be -1;
2504+
var idx5 = funStr.lastIndexOf ("}", idx4 - 1);
2505+
if (idx5 == -1) return;
2506+
var innerClazzStr = funStr.substring (idx3, idx5);
2507+
eval (innerClazzStr);
2508+
Clazz.unloadedClasses[anonyClazz] = null;
2509+
/*
2510+
window.setTimeout ((function (clz, str) {
2511+
return function () {
2512+
eval (str);
2513+
Clazz.unloadedClasses[clz] = null;
2514+
};
2515+
}) (anonyClazz, innerClazzStr), 10);
2516+
*/
24722517
}
24732518
};
24742519

@@ -2486,6 +2531,9 @@ ClazzLoader.lastHotspotSessionID = 0;
24862531
*/
24872532
/* public */
24882533
ClazzLoader.updateHotspot = function () {
2534+
if (Clazz.assureInnerClass == null) {
2535+
Clazz.assureInnerClass = ClazzLoader.assureInnerClass;
2536+
}
24892537
var length = (arguments.length - 1) / 3;
24902538
var lastID = 0;
24912539
var lastUpdated = 0;
@@ -2515,10 +2563,8 @@ ClazzLoader.updateHotspot = function () {
25152563
ClazzLoader.loadClass (clzz, (function (clazz) {
25162564
return function () {
25172565
// succeeded!
2518-
if (window["ClassLoaderProgressMonitor"] != null) {
2519-
ClassLoaderProgressMonitor.showStatus ("Class " + clazz + " is reloaded.", true);
2520-
}
25212566
Clazz.unloadedClasses[clazz] = null;
2567+
ClazzLoader.classReloaded (clazz);
25222568
};
25232569
}) (clzz));
25242570
}

sources/net.sf.j2s.java.core/src/java/lang/ClassLoaderProgressMonitor.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,15 @@ if (window["ClazzLoader"] != null) {
156156
ClazzLoader.globalLoaded = function (file) {
157157
ClassLoaderProgressMonitor.showStatus ("Application loaded.", true);
158158
};
159+
ClazzLoader.classUnloaded = function (clazz) {
160+
ClassLoaderProgressMonitor.showStatus ("Class " + clazz + " is unloaded.", true);
161+
};
162+
ClazzLoader.classReloaded = function (clazz) {
163+
ClassLoaderProgressMonitor.showStatus ("Class " + clazz + " is reloaded.", true);
164+
};
165+
159166
var ua = navigator.userAgent.toLowerCase ();
160167
if (ua.indexOf ("msie") != -1 && ua.indexOf ("opera") == -1) {
161168
ClazzLoader.setLoadingMode ("script", 5);
162169
}
163-
}
170+
}

0 commit comments

Comments
 (0)