8022483: Nashorn compatibility issues in jhat's OQL feature
Reviewed-by: lagergren, attila, hannesw
This commit is contained in:
parent
7d97d75349
commit
35fe257db9
@ -263,15 +263,18 @@ function wrapJavaObject(thing) {
|
|||||||
|
|
||||||
if (name == 'class') {
|
if (name == 'class') {
|
||||||
return wrapJavaValue(instance.clazz);
|
return wrapJavaValue(instance.clazz);
|
||||||
} else if (name == 'toString') {
|
|
||||||
return function() {
|
|
||||||
return instance.toString();
|
|
||||||
}
|
|
||||||
} else if (name == 'wrapped-object') {
|
} else if (name == 'wrapped-object') {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
|
},
|
||||||
|
__call__: function(name) {
|
||||||
|
if (name == 'toString') {
|
||||||
|
return instance.toString();
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -297,7 +300,7 @@ function wrapJavaObject(thing) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return theJavaClassProto[name] != undefined;
|
return false;
|
||||||
},
|
},
|
||||||
__get__ : function(name) {
|
__get__ : function(name) {
|
||||||
for (var i in fields) {
|
for (var i in fields) {
|
||||||
@ -305,7 +308,7 @@ function wrapJavaObject(thing) {
|
|||||||
return wrapJavaValue(fields[i].value);
|
return wrapJavaValue(fields[i].value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return theJavaClassProto[name];
|
return undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,7 +325,12 @@ function wrapJavaObject(thing) {
|
|||||||
this.name = jclass.name;
|
this.name = jclass.name;
|
||||||
this.fields = jclass.fields;
|
this.fields = jclass.fields;
|
||||||
this['wrapped-object'] = jclass;
|
this['wrapped-object'] = jclass;
|
||||||
this.__proto__ = this.statics;
|
}
|
||||||
|
|
||||||
|
for (var i in theJavaClassProto) {
|
||||||
|
if (typeof theJavaClassProto[i] == 'function') {
|
||||||
|
JavaClassWrapper.prototype[i] = theJavaClassProto[i];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns wrapper for Java object arrays
|
// returns wrapper for Java object arrays
|
||||||
@ -334,31 +342,34 @@ function wrapJavaObject(thing) {
|
|||||||
__getIds__ : function() {
|
__getIds__ : function() {
|
||||||
var res = new Array(elements.length);
|
var res = new Array(elements.length);
|
||||||
for (var i = 0; i < elements.length; i++) {
|
for (var i = 0; i < elements.length; i++) {
|
||||||
res[i] = i;
|
res[i] = String(i);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
},
|
},
|
||||||
__has__: function(name) {
|
__has__: function(name) {
|
||||||
return (typeof(name) == 'number' &&
|
return (name >= 0 && name < elements.length) ||
|
||||||
name >= 0 && name < elements.length) ||
|
|
||||||
name == 'length' || name == 'class' ||
|
name == 'length' || name == 'class' ||
|
||||||
name == 'toString' || name == 'wrapped-object';
|
name == 'toString' || name == 'wrapped-object';
|
||||||
},
|
},
|
||||||
__get__ : function(name) {
|
__get__ : function(name) {
|
||||||
if (typeof(name) == 'number' &&
|
if (name >= 0 && name < elements.length) {
|
||||||
name >= 0 && name < elements.length) {
|
|
||||||
return wrapJavaValue(elements[name]);
|
return wrapJavaValue(elements[name]);
|
||||||
} else if (name == 'length') {
|
} else if (name == 'length') {
|
||||||
return elements.length;
|
return elements.length;
|
||||||
} else if (name == 'class') {
|
} else if (name == 'class') {
|
||||||
return wrapJavaValue(array.clazz);
|
return wrapJavaValue(array.clazz);
|
||||||
} else if (name == 'toString') {
|
|
||||||
return function() { return array.toString(); }
|
|
||||||
} else if (name == 'wrapped-object') {
|
} else if (name == 'wrapped-object') {
|
||||||
return array;
|
return array;
|
||||||
} else {
|
} else {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
__call__: function(name) {
|
||||||
|
if (name == 'toString') {
|
||||||
|
return array.toString();
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -373,26 +384,22 @@ function wrapJavaObject(thing) {
|
|||||||
__getIds__ : function() {
|
__getIds__ : function() {
|
||||||
var r = new Array(array.length);
|
var r = new Array(array.length);
|
||||||
for (var i = 0; i < array.length; i++) {
|
for (var i = 0; i < array.length; i++) {
|
||||||
r[i] = i;
|
r[i] = String(i);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
},
|
},
|
||||||
__has__: function(name) {
|
__has__: function(name) {
|
||||||
return (typeof(name) == 'number' &&
|
return (name >= 0 && name < array.length) ||
|
||||||
name >= 0 && name < array.length) ||
|
|
||||||
name == 'length' || name == 'class' ||
|
name == 'length' || name == 'class' ||
|
||||||
name == 'toString' || name == 'wrapped-object';
|
name == 'toString' || name == 'wrapped-object';
|
||||||
},
|
},
|
||||||
__get__: function(name) {
|
__get__: function(name) {
|
||||||
if (typeof(name) == 'number' &&
|
if (name >= 0 && name < array.length) {
|
||||||
name >= 0 && name < array.length) {
|
|
||||||
return elements[name];
|
return elements[name];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name == 'length') {
|
if (name == 'length') {
|
||||||
return array.length;
|
return array.length;
|
||||||
} else if (name == 'toString') {
|
|
||||||
return function() { return array.valueString(true); }
|
|
||||||
} else if (name == 'wrapped-object') {
|
} else if (name == 'wrapped-object') {
|
||||||
return array;
|
return array;
|
||||||
} else if (name == 'class') {
|
} else if (name == 'class') {
|
||||||
@ -400,6 +407,13 @@ function wrapJavaObject(thing) {
|
|||||||
} else {
|
} else {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
__call__: function(name) {
|
||||||
|
if (name == 'toString') {
|
||||||
|
return array.valueString(true);
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -673,34 +687,33 @@ function wrapHeapSnapshot(heap) {
|
|||||||
__getIds__ : function() {
|
__getIds__ : function() {
|
||||||
var res = new Array(path.length);
|
var res = new Array(path.length);
|
||||||
for (var i = 0; i < path.length; i++) {
|
for (var i = 0; i < path.length; i++) {
|
||||||
res[i] = i;
|
res[i] = String(i);
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
},
|
},
|
||||||
__has__ : function (name) {
|
__has__ : function (name) {
|
||||||
return (typeof(name) == 'number' &&
|
return (name >= 0 && name < path.length) ||
|
||||||
name >= 0 && name < path.length) ||
|
|
||||||
name == 'length' || name == 'toHtml' ||
|
name == 'length' || name == 'toHtml' ||
|
||||||
name == 'toString';
|
name == 'toString';
|
||||||
},
|
},
|
||||||
__get__ : function(name) {
|
__get__ : function(name) {
|
||||||
if (typeof(name) == 'number' &&
|
if (name >= 0 && name < path.length) {
|
||||||
name >= 0 && name < path.length) {
|
|
||||||
return path[name];
|
return path[name];
|
||||||
} else if (name == 'length') {
|
} else if (name == 'length') {
|
||||||
return path.length;
|
return path.length;
|
||||||
} else if (name == 'toHtml') {
|
|
||||||
return function() {
|
|
||||||
return computeDescription(true);
|
|
||||||
}
|
|
||||||
} else if (name == 'toString') {
|
|
||||||
return function() {
|
|
||||||
return computeDescription(false);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
__call__: function(name) {
|
||||||
|
if (name == 'toHtml') {
|
||||||
|
return computeDescription(true);
|
||||||
|
} else if (name == 'toString') {
|
||||||
|
return computeDescription(false);
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1005,22 +1018,8 @@ function toHtml(obj) {
|
|||||||
return "<a href='/object/" + id + "'>" +
|
return "<a href='/object/" + id + "'>" +
|
||||||
name + "@" + id + "</a>";
|
name + "@" + id + "</a>";
|
||||||
}
|
}
|
||||||
} else if ((typeof(obj) == 'object') || (obj instanceof JSAdapter)) {
|
} else if (obj instanceof Object) {
|
||||||
if (obj instanceof java.lang.Object) {
|
if (Array.isArray(obj)) {
|
||||||
// script wrapped Java object
|
|
||||||
obj = wrapIterator(obj);
|
|
||||||
// special case for enumeration
|
|
||||||
if (obj instanceof java.util.Enumeration) {
|
|
||||||
var res = "[ ";
|
|
||||||
while (obj.hasMoreElements()) {
|
|
||||||
res += toHtml(obj.nextElement()) + ", ";
|
|
||||||
}
|
|
||||||
res += "]";
|
|
||||||
return res;
|
|
||||||
} else {
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
} else if (obj instanceof Array) {
|
|
||||||
// script array
|
// script array
|
||||||
var res = "[ ";
|
var res = "[ ";
|
||||||
for (var i in obj) {
|
for (var i in obj) {
|
||||||
@ -1047,10 +1046,21 @@ function toHtml(obj) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// JavaScript primitive value
|
// a Java object
|
||||||
|
obj = wrapIterator(obj);
|
||||||
|
// special case for enumeration
|
||||||
|
if (obj instanceof java.util.Enumeration) {
|
||||||
|
var res = "[ ";
|
||||||
|
while (obj.hasMoreElements()) {
|
||||||
|
res += toHtml(obj.nextElement()) + ", ";
|
||||||
|
}
|
||||||
|
res += "]";
|
||||||
|
return res;
|
||||||
|
} else {
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Generic array/iterator/enumeration [or even object!] manipulation
|
* Generic array/iterator/enumeration [or even object!] manipulation
|
||||||
|
@ -79,7 +79,7 @@ bound to a JavaScript variable of the identifier name specified in <span class="
|
|||||||
<li>select all Strings of length 100 or more
|
<li>select all Strings of length 100 or more
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select s from java.lang.String s where s.count >= 100
|
select s from java.lang.String s where s.value.length >= 100
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
<li>select all int arrays of length 256 or more
|
<li>select all int arrays of length 256 or more
|
||||||
@ -92,7 +92,7 @@ bound to a JavaScript variable of the identifier name specified in <span class="
|
|||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select s.value.toString() from java.lang.String s
|
select s.value.toString() from java.lang.String s
|
||||||
where /java/(s.value.toString())
|
where /java/.test(s.value.toString())
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
<li>show path value of all File objects
|
<li>show path value of all File objects
|
||||||
@ -219,7 +219,6 @@ Examples:
|
|||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select heap.findClass("java.lang.System").statics.props
|
select heap.findClass("java.lang.System").statics.props
|
||||||
select heap.findClass("java.lang.System").props
|
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
<li>get number of fields of java.lang.String class
|
<li>get number of fields of java.lang.String class
|
||||||
@ -237,7 +236,7 @@ Examples:
|
|||||||
<li>select all classes that have name pattern java.net.*
|
<li>select all classes that have name pattern java.net.*
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select <a href="#filter">filter</a>(heap.classes(), "/java.net./(it.name)")
|
select <a href="#filter">filter</a>(heap.classes(), "/java.net./.test(it.name)")
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
</ul>
|
</ul>
|
||||||
@ -536,7 +535,7 @@ refer to the following built-in variables.
|
|||||||
Example: print number of classes that have specific name pattern
|
Example: print number of classes that have specific name pattern
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select count(<a href="#classes">heap.classes()</a>, "/java.io./(it.name)")
|
select count(<a href="#classes">heap.classes()</a>, "/java.io./.test(it.name)")
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
@ -559,14 +558,14 @@ Examples:
|
|||||||
<li>show all classes that have java.io.* name pattern
|
<li>show all classes that have java.io.* name pattern
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select filter(<a href="#classes">heap.classes</a>(), "/java.io./(it.name)")
|
select filter(<a href="#classes">heap.classes</a>(), "/java.io./.test(it.name)")
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
<li> show all referrers of URL object where the referrer is not from
|
<li> show all referrers of URL object where the referrer is not from
|
||||||
java.net package
|
java.net package
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select filter(<a href="#referrers">referrers</a>(u), "! /java.net./(<a href="#classof">classof</a>(it).name)")
|
select filter(<a href="#referrers">referrers</a>(u), "! /java.net./.test(<a href="#classof">classof</a>(it).name)")
|
||||||
from java.net.URL u
|
from java.net.URL u
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
@ -619,13 +618,13 @@ Examples:
|
|||||||
<li>find the maximum length of any String instance
|
<li>find the maximum length of any String instance
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select max(map(heap.objects('java.lang.String', false), 'it.count'))
|
select max(map(heap.objects('java.lang.String', false), 'it.value.length'))
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
<li>find string instance that has the maximum length
|
<li>find string instance that has the maximum length
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select max(heap.objects('java.lang.String'), 'lhs.count > rhs.count')
|
select max(heap.objects('java.lang.String'), 'lhs.value.length > rhs.value.length')
|
||||||
</code>
|
</code>
|
||||||
</pre>
|
</pre>
|
||||||
</ul>
|
</ul>
|
||||||
@ -775,7 +774,7 @@ and walk until parent is null using the callback function to map call.
|
|||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
<code>
|
<code>
|
||||||
select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').props.table, 'it != null'),
|
select <a href="#map">map</a>(<a href="#filter">filter(<a href="#findClass">heap.findClass</a>('java.lang.System').statics.props.table, 'it != null'),
|
||||||
function (it) {
|
function (it) {
|
||||||
var res = "";
|
var res = "";
|
||||||
while (it != null) {
|
while (it != null) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user