提交 889d2efa 编写于 作者: S sundar

8022483: Nashorn compatibility issues in jhat's OQL feature

Reviewed-by: lagergren, attila, hannesw
上级 91ffcc8a
...@@ -263,18 +263,21 @@ function wrapJavaObject(thing) { ...@@ -263,18 +263,21 @@ 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;
},
__call__: function(name) {
if (name == 'toString') {
return instance.toString();
} else {
return undefined; return undefined;
} }
} }
} }
}
// return wrapper for Java Class objects // return wrapper for Java Class objects
...@@ -297,7 +300,7 @@ function wrapJavaObject(thing) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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) { ...@@ -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') { } else {
return function() { return undefined;
return computeDescription(true);
} }
},
__call__: function(name) {
if (name == 'toHtml') {
return computeDescription(true);
} else if (name == 'toString') { } else if (name == 'toString') {
return function() {
return computeDescription(false); return computeDescription(false);
}
} else { } else {
return undefined; return undefined;
} }
}, }
}; };
} }
...@@ -1005,22 +1018,8 @@ function toHtml(obj) { ...@@ -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,9 +1046,20 @@ function toHtml(obj) { ...@@ -1047,9 +1046,20 @@ 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;
} }
}
} }
/* /*
......
...@@ -79,7 +79,7 @@ bound to a JavaScript variable of the identifier name specified in <span class=" ...@@ -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=" ...@@ -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: ...@@ -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: ...@@ -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. ...@@ -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: ...@@ -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: ...@@ -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. ...@@ -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) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册