r9749 - helma-ng/trunk/lib
[email protected] Thu, 14 May 2009 15:18:20 +0200 (CEST)
| Newsgroups | gmane.comp.java.helma.cvs |
|---|---|
| Message-ID | <20090514131820.1AEEA3D0D6@mia> |
Author: hannes
Date: 2009-05-14 15:18:19 +0200 (Thu, 14 May 2009)
New Revision: 9749
Modified:
helma-ng/trunk/lib/js.jar
helma-ng/trunk/lib/rhino-patch.diff
Log:
Add new rhino patch to prevent unwrapping of return values from scriptable JavaAdapters (unfiled bug)
Details at http://dev.helma.org/trac/helma/changeset/9749
Modified: helma-ng/trunk/lib/js.jar
===================================================================
(Binary files differ)
Modified: helma-ng/trunk/lib/rhino-patch.diff
===================================================================
--- helma-ng/trunk/lib/rhino-patch.diff 2009-05-13 15:09:12 UTC (rev 9748)
+++ helma-ng/trunk/lib/rhino-patch.diff 2009-05-14 13:18:19 UTC (rev 9749)
@@ -1,10 +1,10 @@
Index: src/org/mozilla/javascript/IRFactory.java
===================================================================
RCS file: /cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/IRFactory.java,v
-retrieving revision 1.122
-diff -u -r1.122 IRFactory.java
---- src/org/mozilla/javascript/IRFactory.java 3 Mar 2009 16:02:09 -0000 1.122
-+++ src/org/mozilla/javascript/IRFactory.java 8 May 2009 20:46:17 -0000
+retrieving revision 1.124
+diff -u -r1.124 IRFactory.java
+--- src/org/mozilla/javascript/IRFactory.java 11 May 2009 15:44:04 -0000 1.124
++++ src/org/mozilla/javascript/IRFactory.java 14 May 2009 11:03:25 -0000
@@ -398,7 +398,7 @@
// Bug: for code like "var obj={p:3};[obj.p]=[9];", "left" will
// be ARRAYLITERAL with an embedded GETPROP. This causes errors
@@ -14,14 +14,144 @@
target = left;
} else {
target = transform(left);
+Index: src/org/mozilla/javascript/JavaAdapter.java
+===================================================================
+RCS file: /cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/JavaAdapter.java,v
+retrieving revision 1.117
+diff -u -r1.117 JavaAdapter.java
+--- src/org/mozilla/javascript/JavaAdapter.java 14 Nov 2008 13:52:29 -0000 1.117
++++ src/org/mozilla/javascript/JavaAdapter.java 14 May 2009 11:03:26 -0000
+@@ -131,6 +131,10 @@
+
+ public static Object convertResult(Object result, Class<?> c)
+ {
++ return convertResult(result, c, true);
++ }
++
++ public static Object convertResult(Object result, Class<?> c, boolean unwrap) {
+ if (result == Undefined.instance &&
+ (c != ScriptRuntime.ObjectClass &&
+ c != ScriptRuntime.StringClass))
+@@ -138,7 +142,7 @@
+ // Avoid an error for an undefined value; return null instead.
+ return null;
+ }
+- return Context.jsToJava(result, c);
++ return unwrap ? Context.jsToJava(result, c) : result;
+ }
+
+ public static Scriptable createAdapterWrapper(Scriptable obj,
+@@ -353,9 +357,13 @@
+ (short) (ClassFileWriter.ACC_PUBLIC |
+ ClassFileWriter.ACC_FINAL));
+ int interfacesCount = interfaces == null ? 0 : interfaces.length;
++ boolean isScriptable = Scriptable.class.isAssignableFrom(superClass);
+ for (int i=0; i < interfacesCount; i++) {
+- if (interfaces[i] != null)
++ if (interfaces[i] != null) {
+ cfw.addInterface(interfaces[i].getName());
++ isScriptable = isScriptable
++ || Scriptable.class.isAssignableFrom(interfaces[i]);
++ }
+ }
+
+ String superName = superClass.getName().replace('.', '/');
+@@ -395,7 +403,7 @@
+ String methodKey = methodName + methodSignature;
+ if (! generatedOverrides.has(methodKey)) {
+ generateMethod(cfw, adapterName, methodName,
+- argTypes, method.getReturnType());
++ argTypes, method.getReturnType(), !isScriptable);
+ generatedOverrides.put(methodKey, 0);
+ generatedMethods.put(methodName, 0);
+ }
+@@ -423,7 +431,7 @@
+ String methodKey = methodName + methodSignature;
+ if (! generatedOverrides.has(methodKey)) {
+ generateMethod(cfw, adapterName, methodName,
+- argTypes, method.getReturnType());
++ argTypes, method.getReturnType(), !isScriptable);
+ generatedOverrides.put(methodKey, 0);
+ generatedMethods.put(methodName, 0);
+
+@@ -450,7 +458,7 @@
+ for (int k=0; k < length; k++)
+ parms[k] = ScriptRuntime.ObjectClass;
+ generateMethod(cfw, adapterName, functionName, parms,
+- ScriptRuntime.ObjectClass);
++ ScriptRuntime.ObjectClass, !isScriptable);
+ }
+ return cfw.toByteArray();
+ }
+@@ -817,7 +825,7 @@
+ * Generates the appropriate RETURN bytecode.
+ */
+ static void generateReturnResult(ClassFileWriter cfw, Class<?> retType,
+- boolean callConvertResult)
++ boolean convertResult)
+ {
+ // wrap boolean values with java.lang.Boolean, convert all other
+ // primitive values to java.lang.Double.
+@@ -874,20 +882,19 @@
+
+ } else {
+ String retTypeStr = retType.getName();
+- if (callConvertResult) {
+- cfw.addLoadConstant(retTypeStr);
+- cfw.addInvoke(ByteCode.INVOKESTATIC,
+- "java/lang/Class",
+- "forName",
+- "(Ljava/lang/String;)Ljava/lang/Class;");
+-
+- cfw.addInvoke(ByteCode.INVOKESTATIC,
+- "org/mozilla/javascript/JavaAdapter",
+- "convertResult",
+- "(Ljava/lang/Object;"
+- +"Ljava/lang/Class;"
+- +")Ljava/lang/Object;");
+- }
++ cfw.addLoadConstant(retTypeStr);
++ cfw.addInvoke(ByteCode.INVOKESTATIC,
++ "java/lang/Class",
++ "forName",
++ "(Ljava/lang/String;)Ljava/lang/Class;");
++ cfw.addLoadConstant(convertResult ? 1 : 0);
++ cfw.addInvoke(ByteCode.INVOKESTATIC,
++ "org/mozilla/javascript/JavaAdapter",
++ "convertResult",
++ "(Ljava/lang/Object;"
++ +"Ljava/lang/Class;"
++ +"Z"
++ +")Ljava/lang/Object;");
+ // Now cast to return type
+ cfw.add(ByteCode.CHECKCAST, retTypeStr);
+ cfw.add(ByteCode.ARETURN);
+@@ -896,7 +903,7 @@
+
+ private static void generateMethod(ClassFileWriter cfw, String genName,
+ String methodName, Class<?>[] parms,
+- Class<?> returnType)
++ Class<?> returnType, boolean convertResult)
+ {
+ StringBuffer sb = new StringBuffer();
+ int paramsEnd = appendMethodSignature(parms, returnType, sb);
+@@ -959,7 +966,7 @@
+ +"J"
+ +")Ljava/lang/Object;");
+
+- generateReturnResult(cfw, returnType, true);
++ generateReturnResult(cfw, returnType, convertResult);
+
+ cfw.stopMethod((short)paramsEnd);
+ }
Index: src/org/mozilla/javascript/Parser.java
===================================================================
RCS file: /cvsroot/mozilla/js/rhino/src/org/mozilla/javascript/Parser.java,v
-retrieving revision 1.135
-diff -u -r1.135 Parser.java
---- src/org/mozilla/javascript/Parser.java 7 Apr 2009 21:12:33 -0000 1.135
-+++ src/org/mozilla/javascript/Parser.java 8 May 2009 20:46:19 -0000
-@@ -3439,6 +3439,7 @@
+retrieving revision 1.138
+diff -u -r1.138 Parser.java
+--- src/org/mozilla/javascript/Parser.java 11 May 2009 15:44:04 -0000 1.138
++++ src/org/mozilla/javascript/Parser.java 14 May 2009 11:03:26 -0000
+@@ -3491,6 +3491,7 @@
int type;
if (nodeType == Token.GETPROP) {
type = Token.SETPROP;