< prev index next >
jaxp/src/java.xml/share/classes/com/sun/org/apache/xalan/internal/xsltc/compiler/FunctionCall.java
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
*/
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
@@ -30,10 +30,11 @@
import com.sun.org.apache.bcel.internal.generic.INVOKESTATIC;
import com.sun.org.apache.bcel.internal.generic.INVOKEVIRTUAL;
import com.sun.org.apache.bcel.internal.generic.InstructionConstants;
import com.sun.org.apache.bcel.internal.generic.InstructionList;
import com.sun.org.apache.bcel.internal.generic.InvokeInstruction;
+import com.sun.org.apache.bcel.internal.generic.LDC;
import com.sun.org.apache.bcel.internal.generic.LocalVariableGen;
import com.sun.org.apache.bcel.internal.generic.NEW;
import com.sun.org.apache.bcel.internal.generic.PUSH;
import com.sun.org.apache.xalan.internal.utils.FeatureManager;
import com.sun.org.apache.xalan.internal.utils.ObjectFactory;
@@ -790,10 +791,15 @@
if (isSecureProcessing && !isExtensionFunctionEnabled)
translateUnallowedExtension(cpg, il);
final String clazz =
_chosenConstructor.getDeclaringClass().getName();
+
+ // Generate call to Module.addReads:
+ // <TransletClass>.class.getModule().addReads(
+ generateAddReads(classGen, methodGen, clazz);
+
Class[] paramTypes = _chosenConstructor.getParameterTypes();
LocalVariableGen[] paramTemp = new LocalVariableGen[n];
// Backwards branches are prohibited if an uninitialized object is
// on the stack by section 4.9.4 of the JVM Specification, 2nd Ed.
@@ -853,10 +859,16 @@
translateUnallowedExtension(cpg, il);
final String clazz = _chosenMethod.getDeclaringClass().getName();
Class[] paramTypes = _chosenMethod.getParameterTypes();
+
+ // Generate call to Module.addReads:
+ // <TransletClass>.class.getModule().addReads(
+ // Class.forName(<clazz>).getModule());
+ generateAddReads(classGen, methodGen, clazz);
+
// Push "this" if it is an instance method
if (_thisArgument != null) {
_thisArgument.translate(classGen, methodGen);
}
@@ -894,10 +906,45 @@
_type.translateFrom(classGen, methodGen,
_chosenMethod.getReturnType());
}
}
+ private void generateAddReads(ClassGenerator classGen, MethodGenerator methodGen,
+ String clazz) {
+ final ConstantPoolGen cpg = classGen.getConstantPool();
+ final InstructionList il = methodGen.getInstructionList();
+
+ // Generate call to Module.addReads:
+ // <TransletClass>.class.getModule().addReads(
+ // Class.forName(<clazz>).getModule());
+ // Class.forName may throw ClassNotFoundException.
+ // This is OK as it will caught higher up the stack in
+ // TransformerImpl.transform() and wrapped into a
+ // TransformerException.
+ methodGen.markChunkStart();
+
+ int index = cpg.addMethodref(CLASS_CLASS,
+ GET_MODULE,
+ GET_MODULE_SIG);
+ int index2 = cpg.addMethodref(CLASS_CLASS,
+ FOR_NAME,
+ FOR_NAME_SIG);
+ il.append(new LDC(cpg.addString(classGen.getClassName())));
+ il.append(new INVOKESTATIC(index2));
+ il.append(new INVOKEVIRTUAL(index));
+ il.append(new LDC(cpg.addString(clazz)));
+ il.append(new INVOKESTATIC(index2));
+ il.append(new INVOKEVIRTUAL(index));
+ index = cpg.addMethodref(MODULE_CLASS,
+ ADD_READS,
+ ADD_READS_SIG);
+ il.append(new INVOKEVIRTUAL(index));
+ il.append(InstructionConstants.POP);
+
+ methodGen.markChunkEnd();
+ }
+
@Override
public String toString() {
return "funcall(" + _fname + ", " + _arguments + ')';
}
< prev index next >