I would look at the org.mozilla.javascript.tools.shell.Global class as
an example of this: specifically the defineFunctionProperties()
method.

On Jul 21, 7:11 pm, Ivan Voras <[EMAIL PROTECTED]> wrote:
> Hi,
>
> I've just started exploring Rhino and one of the first things I'd like
> to do is add a global "println" function that my JS scripts can use, and
> then add more functions. The idea is that the added function must be
> able to access internal state so my first attempt was to create a
> ScriptableObject-based class with a method called "println" and use it
> as a starting scope as in:
>
>    stdlib = new MyStdLib();
>    cx.initStandardObjects(stdlib)
>    Script s = ...
>    s.exec(cx, stdlib);
>    ...
>
> This didn't work, and after a lot of trial and error I got to a point
> where the following works:
>
>    MyStdLib stdlib = new MyStdLib(zr);
>    Context cx = jscf.enterContext();
>    Scriptable scope = cx.initStandardObjects(stdlib);
>    Script s = ...
>    s.exec(cx, scope);
>
> and the MyStdLib class looks like:
>
> class MyStdLib extends ScriptableObject
> {
>
>      private InternalData zr;
>
>      protected MyStdLib(InternalData zr)
>      {
>          this.zr = zr;
>          try {
>
>             /* This is the important bit */
>             FunctionObject println = new FunctionObject("println",
> MyStdLib.class.getDeclaredMethod("js_println", Context.class,
> Scriptable.class, Object[].class, Function.class), this);
>
>             this.put("println", this, println);
>
>          } catch (Exception ex) {
>
> Logger.getLogger(MyStdLib.class.getName()).log(Level.SEVERE, null, ex);
>          }
>      }
>
>      @Override
>      public String getClassName() {
>          return "MyStdLib";
>      }
>
>      protected static Object js_println(Context cx, Scriptable thisObj,
> Object[] args, Function func)
>      {
>          if (!(thisObj instanceof MyStdLib)) {
>              Context.reportError("Not based in MyStdLib");
>              return null;
>          }
>
>          MyStdLib stdlib = (MyStdLib) thisObj;
>          for (int i = 0; i < args.length; i++) {
>              stdlib.zr.out.print(args[i]);
>              if (i != args.length-1)
>                  stdlib.zr.out.print(" ");
>          }
>          stdlib.zr.out.println();
>          return null;
>      }
>
> }
>
> The question is: this looks somewhat "dirty" - isn't there a way I can
> simply declare functions and they get automagically exported to the JS
> scope? I tried creating jsFunction_println in MyStdLib but it isn't
> picked up.



_______________________________________________
dev-tech-js-engine-rhino mailing list
[email protected]
https://lists.mozilla.org/listinfo/dev-tech-js-engine-rhino

Reply via email to