Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [ease-dev] Could EASE helper modules have only a static public interface?

Christian-

Thanks. Yes, I thought it might be something like that, that there were some interpreter specific things used by some of the modules. I can see the argument that it is better to do it one way (the current way) than cause confusion by having two ways to do things, one of which doesn't work sometimes. I was surprised myself that the constructor worked without "new". Also, I expected I would have to supply some kind of arguments like to a script interpreter. I then am curious what specific method calls will fail because presumably some default constructor was used to make those instances and it may not have the interpreter set correctly?

Still, is it possible that there is some way for the Java code to figure out what interpreter it was called from? Perhaps by looking up the call stack? Or maybe by looking at some thread-specific data? Then maybe these could all be static methods and they could just get that minimal information by such a lookup process in cases where they need it? Another option might be to use Java's "ThreadLocal" storage?
http://java.dzone.com/articles/painless-introduction-javas-threadlocal-storage

Rhino already seems to define such a ThreadLocal variable with the interpreter:
http://schierlm.users.sourceforge.net/CVE-2011-3544.html
"The reason for this is simple: Rhino expects every script call to be run inside of a Context - basically an object that captures your local variables etc. This context is stored in a thread local variable to be available all the time when the script is executed. Since we called an "internal" method directly, there is no context assigned to the current thread any longer, so we get this error."

However, that is just for the Rhino interpreter. Possibly EASE needs its own extra information? Again though, maybe that could be done as a thread local thing? Although, would that work because EASE support multiple threads (like a main interpreter thread and then running stuff on the GUI thread)?

Some other related discussion on Rhino and multiple thread:
"Single Rhino Context in MultiThreaded Environment"
https://groups.google.com/forum/?_escaped_fragment_=topic/mozilla.dev.tech.js-engine.rhino/VifR2mwNxko

Is trying to resolve this worth the trouble or the extra complexity (including for cleanup of ThreadLocal variables to prevent leaks) compared to just making module instances that know what interpreter they go with? I don't know because I still don't know for sure if it is possible or how complex and brittle the EASE code would become as far as maintenance with such a change. However, I suspect though that this may not be that hard to do, perhaps with some function like getCurrentEaseContext() that would get the ThreadLocal context. If it was easy, then perhaps the whole process of writing and importing core EASE modules could be simplified down to importing Java classes with only static methods.

--Paul Fernhout

On 11/26/14 1:11 AM, Christian Pontesegger wrote:
Hi

On 25.11.2014 19:39, Paul D. Fernhout wrote:
> org.eclipse.ease.modules.platform.UIModule.setClipboard("hello");

    Java class "org.eclipse.ease.modules.platform.UIModule" has no
public instance field or method named "setClipboard".

> org.eclipse.ease.modules.platform.UIModule().setClipboard("hello");

    [null]

First I was not aware that you may skip the "new" keyword in js, thanks
for showing me a new trick :)

For the functions: some methods require access to the running script
engine. Eg resources need it to resolve relative files. Same applies for
UIModule.executeUI(). Does not work for static methods as we need engine
specific information here. As multiple engines might run concurrently,
we cannot use statics here.

Some other methods could be static, so we can think of changing them.
Question is, if this helps, because your first example of accessing
methods would only work for some methods, while the latter would work
for any method.

--
Christian



Back to the top