I don't call observeInstructionCount() myself - Rhino does that. I just call stop().
On Mon, Mar 9, 2009 at 3:15 PM, Rhino user <[email protected]> wrote: > On Mar 9, 2:58 pm, Rhino user <[email protected]> wrote: >> On Feb 19, 8:02 am, Patrick Lightbody <[email protected]> wrote: >> >> >> >> > David, >> > I think we got a little mixed up - what I ended up doing is: >> >> > public class StoppableContext extends Context { >> > private boolean stop; >> >> > @Override >> > protected void observeInstructionCount(int instructionCount) { >> > if (stop) { >> > throw new StoppedExecutionException(); >> > } >> > } >> >> > public void stop() { >> > stop = true; >> > } >> >> > } >> >> > Which is basically what you just wrote :) My only complaint was the >> > visibility of the constructor, but it sounds like that's already a >> > known issue and will be solved soon. >> >> > Patrick >> >> > On Thu, Feb 19, 2009 at 6:58 AM, David Parks <[email protected]> >> > wrote: >> > > Let me paraphrase to make sure I understand you. >> > > You want to call observeInstructionCount() externally as the method which >> > > will interrupt the thread? >> >> > > If I understood that right then all you want to do is create another >> > > method >> > > in the "MyContext" factory which will set an interrupt flag that >> > > observeInstructionCount will monitor. >> >> > > To extend the example given: >> >> > > // Custom Context to store execution time. >> > > private static class MyContext extends Context >> > > { >> > > long startTime; >> > > boolean interruptFlag = false; >> > > } >> >> > > public synchronized interruptScript(){ >> > > interruptFlag = true; >> > > } >> >> > > // Override observeInstructionCount(Context, int) >> > > protected void observeInstructionCount(Context cx, int >> > > instructionCount) >> > > { >> > > //All the other stuff from the example... >> > > if(interruptFlag == true) throw new Error(); >> > > } >> >> > > observeInstructionConnt() is only being called by the javascript engine >> > > which in turn monitors for the exception to be thrown and propagates it >> > > through the script (the Error's can't be caught by the script, hence it >> > > propagates right through and out of the script context). >> >> > > Let me know if I'm off base with my understanding. >> >> > > David >> >> > > -----Original Message----- >> > > From: [email protected] [mailto:[email protected]] On Behalf Of Patrick >> > > Lightbody >> > > Sent: Thursday, February 19, 2009 9:26 AM >> > > To: Attila Szegedi >> > > Cc: David Parks; [email protected] >> > > Subject: Re: Stopping JavaScript Evaluation >> >> > > Duh - thanks! I was starting to do that last night, though instead of >> > > a subclass I was looking at getThreadLocal() and putThreadLocal() as a >> > > way to get a "Stoppable" object that had the flag in it. >> >> > > I'd rather do it on the Context directly (less indirection), but am >> > > curious about one thing: It doesn't appear a subclass (MyContext) can >> > > set the internal factory field. This will cause an error in many of >> > > the default methods of Context. For example: >> >> > > protected void observeInstructionCount(int instructionCount) >> > > { >> > > ContextFactory f = getFactory(); >> > > f.observeInstructionCount(this, instructionCount); >> > > } >> >> > > Because the "factory" field is private and is only set in a >> > > package-protected constructor, and because getFactory() is >> > > public+final, there is no way for me to extend Context while still >> > > passing in a reference to the factory. In the example JavaDocs, this >> > > looks like it's skipped entirely. >> >> > > It may work for me, since I'll be overriding observeInstructionCount >> > > and not calling super, but it worries me a bit. There are other >> > > methods that also depend on the factory being not-null: >> >> > > public boolean hasFeature(int featureIndex) >> > > { >> > > ContextFactory f = getFactory(); >> > > return f.hasFeature(this, featureIndex); >> > > } >> >> > > public static void exit() >> > > { >> > > Object helper = VMBridge.instance.getThreadContextHelper(); >> > > Context cx = VMBridge.instance.getContext(helper); >> > > if (cx == null) { >> > > throw new IllegalStateException( >> > > "Calling Context.exit without previous Context.enter"); >> > > } >> > > if (cx.enterCount < 1) Kit.codeBug(); >> > > if (--cx.enterCount == 0) { >> > > VMBridge.instance.setContext(helper, null); >> > > cx.factory.onContextReleased(cx); >> > > } >> > > } >> >> > > Any ideas? >> >> > > Patrick >> >> > > On Thu, Feb 19, 2009 at 1:57 AM, Attila Szegedi <[email protected]> >> > > wrote: >> > >> On 2009.02.19., at 7:49, David Parks wrote: >> >> > >>> Can you not add the stop flag check to the observeInstructionCount >> > >>> callback >> > >>> method? That would be the most straight forward way to stop the script >> > > and >> > >>> really take very few lines of code to implement. Can you explain why >> > >>> this >> > >>> wouldn't work in your case? If you're concerned with finding a >> > >>> reference >> > >>> to >> > >>> the stop check flag you can always extend Context and add your own >> > >>> reference >> > >>> to whatever object contains the check you need to perform as nearly >> > >>> demonstrated in this example: >> >> > >http://www.mozilla.org/rhino/apidocs/org/mozilla/javascript/ContextFa... >> > >>> tml >> >> > >> Hm... I'm thinking I might update that example a bit - throw a >> > >> java.lang.ThreadDeath specifically in place of generic java.lang. Error. >> >> > >> Attila. >> >> > >>> David >> >> > >> _______________________________________________ >> > >> dev-tech-js-engine-rhino mailing list >> > >> [email protected] >> > >>https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino >> >> > > _______________________________________________ >> > > dev-tech-js-engine-rhino mailing list >> > > [email protected] >> > >https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino >> >> When does the observeInstructionCount() of Context get called? I >> thught that it gets called only if the setOptimizationLevel is set to >> -1. Is that correct? > > Also , If the ContextFactory is not global will the > observeInstructionCount() on the context will get called > automatically? > If not , is it ok to do something like ((MyContext)Cx).getFactory > ().observeInstructionCount(Cx, instructionCount)? > _______________________________________________ > dev-tech-js-engine-rhino mailing list > [email protected] > https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino > _______________________________________________ dev-tech-js-engine-rhino mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino
