Hello again.

I'm having major problems with the JavaScript engine which comes bundled
with Java 6 (version 1.6.0_10 here). After working my way through the
rather uncomfortable API provided by the javax.script package, I found
that some of the scripts we use were producing errors in unexpected
places. I was able to pinpoint the problem to assignments like this:

  var x = undefined || 0;

This assigns undefined to x, instead of 0. Other, similar assignments
are also broken (see test class below). Unfortunately, this is a very
frequently used construct. Is (or was) this a known problem, and is
there a workaround?

The engine identifies itself as "Mozilla Rhino, version 1.6 release 2".
I realize that's a very old version, and I've never had this problem
with more recent versions of the standalone Rhino package.


Thanks in advance,
Stefan


---------------------------------------------------
The test class below produces the following output (for me):

input      expected   actual     result

false      number     number     0.0
undefined  number     undefined  sun.org.j[...].undefi...@e3b895
null       number     number     0.0
''         number     string
0          number     number     0.0
-0         number     number     0.0
true       boolean    boolean    true
' '        string     string
1          number     boolean    true
{}         object     object     [object Object]

---------------------------------------------------

import java.util.*;
import javax.script.*;

public final class RhinoTest3 {

    public static void main (String[] args) throws Exception
    {
        ScriptEngineManager mgr = new ScriptEngineManager();
        ScriptEngine engine = mgr.getEngineByName("JavaScript");
        Invocable inv = (Invocable) engine;

        Map<String, String> tests = new LinkedHashMap<String, String>();
        //        input        expected result type
        tests.put("false",     "number");
        tests.put("undefined", "number");
        tests.put("null",      "number");
        tests.put("''",        "number");
        tests.put("0",         "number");
        tests.put("-0",        "number");
        tests.put("true",      "boolean");
        tests.put("' '",       "string");
        tests.put("1",         "number");
        tests.put("{}",        "object");

        System.out.println("input      expected   actual     result");
        System.out.println();
        for (Map.Entry test : tests.entrySet()) {
            String js = "var x = " + test.getKey() + " || 0; typeof x";
            String type = (String) engine.eval(js);
            System.out.printf("%-10s %-10s %-10s %s%n",
                              test.getKey(),
                              test.getValue(),
                              type,
                              "" + engine.get("x"));
        }
    }

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

Reply via email to