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?
_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino

Reply via email to