Hi Yasumasa,

Sorry for delayed response. Your webrev looks like a good start! Unfortunately, dependency on nashorn is inevitable. But there is a similar (but different) object API for Graal.js. In future, someone may have to do some porting work.

Thanks,
-Sundar

On 19/04/19, 6:37 PM, Yasumasa Suenaga wrote:
Hi Sundar,

I tried to implement JSObject for SA.
Following webrev is not completed, but it can get VM object
and Debugger in it from sa.js:

  http://cr.openjdk.java.net/~ysuenaga/JDK-8157947/jsobject.work/

It is not completed (error will occur when CLSDB is attached.)
but I want to hear your opinion. So I share it.

AFAIK JSObject impl. idea needs to use AbstractJSObject, but it is
provided by jdk.scripting.nashorn module.
However Nashorn has been deprecated by JEP 335 and it might be removed.

Can we fix this issue not to depend on jdk.scripting.nashorn module?
If it can't, is it allowed to use deprecated module?

I guess Nashorn might be replaced to Graal.js in the future.
So I concern it is not better to depend on Nashorn.


Thanks,

Yasumasa


On 2019/04/19 11:36, Sundararajan Athijegannathan wrote:
Hi Yasumasa

Thanks for confirming that we've the same issue with Graal.js as well. I think JSObject impl. idea should be investigated. I think there is similar (script) reflective API in Graal.js as well.

Thanks
-Sundar

On 17/04/19, 7:37 PM, Yasumasa Suenaga wrote:
Hi Sundar,

On 2019/04/16 13:32, Sundararajan Athijegannathan wrote:
Hi Yasumasa,

Response comments inlined below..


On 16/04/19, 5:21 AM, Yasumasa Suenaga wrote:
Hi Sundar,

On 2019/04/15 16:58, Sundararajan Athijegannathan wrote:
Both options are hacks :( Personally I'm not comfortable with either
option.

JSObject wrapper suggested in the bug is not impossible to do.

VM.getVM() would the "initial object" -- a JSObject impl. that walks
through objects is possible. JSObject impls. can cache fields/methods reflectively and invoke those as needed. If SA class is needed, we can
add JSClassObject impl. (which would a JSObject impl. that'd support
static method/field access).

I guess SA classes will be added / modified due to HotSpot improvement (e.g. GC, JIT, etc...)
So I think it is not reasonable to add JSClassObject implementations.

We need to add only *one* JSClassObject class (which can expose static fields/methods of a given java.lang.Class which is maintained as an instance field).

Also, we may need to add a hook for looking for a class (like Java.type - but constructs JSClassObject instance instead).

In addition, I guess this restriction is on Nashorn only.
Nashorn might be replaced to Graal.js .

I'm not sure. If a JS implementation is module aware, it'll have the same issue. The core issue issue here we don't want public/exposed API from hotspot module. But we want to allow access to hotspot types, methods *only* from scripts => we need some sort of backdoor. I'd like JS reflection (JSObject) based backdoors rather than breaking module boundary using JNI code.


Do we see this issue with other JS Engine?
If not so, I want to use other JS Engine (e,g, Graal).

Yes, definitely no harm trying to see if other impls. have the same issue or not.

I tried to use Graal in CLHSDB, but it did not work well.
Graal.js uses j.l.r.Proxy which is defined by dynamic module.
So I saw IllegalAccessError when CLHSDB attempt to call VM.getVM().


Thanks,

Yasumasa


Thanks,
-Sundar


Thanks,

Yasumasa


-Sundar

On 12/04/19, 7:35 PM, Yasumasa Suenaga wrote:
Hi all,

I saw the message when I attached CLHSDB to target VM as below:

----
javax.script.ScriptException: TypeError: sapkg.runtime.VM.getVM is not
a function in sa.js at line number 54
Warning! JS Engine can't start, some commands will not be available.
----

It has been reported as JDK-8157947.


It is caused that jdk.hotspot.agent module is not exported to
nashorn dynamic module.
The comment in JDK-8157947 says that it will be fixed if we implement
JSObject, but I think it is difficult because we cannot know
what classes in SA are used in user scripts.

So I think two approaches for this issue:


   1. Open all packages in module-info in jdk.hotspot.agent
        I filed suggested fix to JBS, but it is not smart...

   2. Open all packages in JSJavaScriptEngine::<clinit>
        Opens all packages to Module.EVERYONE_MODULE.
        But EVERYONE_MODULE is private field, so we need to access
        from JNI code.
http://cr.openjdk.java.net/~ysuenaga/JDK-8157947/proposal/
        This change has passed serviceability/sa jtreg tests.


Both ideas is hackish, but I prefer to 2. to fix it.
If 2. is accepted I will push it to submit repo and send review request.

What do you think?


Thanks,

Yasumasa

Reply via email to