< prev index next >

src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/linker/NashornCallSiteDescriptor.java

Print this page

        

*** 32,41 **** --- 32,42 ---- import java.util.concurrent.ConcurrentMap; import jdk.internal.dynalink.CallSiteDescriptor; import jdk.internal.dynalink.support.AbstractCallSiteDescriptor; import jdk.internal.dynalink.support.CallSiteDescriptorFactory; import jdk.nashorn.internal.ir.debug.NashornTextifier; + import jdk.nashorn.internal.runtime.ScriptRuntime; /** * Nashorn-specific implementation of Dynalink's {@link CallSiteDescriptor}. The reason we have our own subclass is that * we can have a more compact representation, as we know that we're always only using {@code "dyn:*"} operations; also * we're storing flags in an additional primitive field.
*** 246,255 **** --- 247,304 ---- public String getOperand() { return operand; } /** + * If this is a dyn:call or dyn:new, this returns function description from callsite. + * Caller has to make sure this is a dyn:call or dyn:new call site. + * + * @return function description if available (or null) + */ + public String getFunctionDescription() { + assert getFirstOperator().equals("call") || getFirstOperator().equals("new"); + return getNameTokenCount() > 2? getNameToken(2) : null; + } + + /** + * If this is a dyn:call or dyn:new, this returns function description from callsite. + * Caller has to make sure this is a dyn:call or dyn:new call site. + * + * @param desc call site descriptor + * @return function description if available (or null) + */ + public static String getFunctionDescription(final CallSiteDescriptor desc) { + return desc instanceof NashornCallSiteDescriptor ? + ((NashornCallSiteDescriptor)desc).getFunctionDescription() : null; + } + + + /** + * Returns the error message to be used when dyn:call or dyn:new is used on a non-function. + * + * @param obj object on which dyn:call or dyn:new is used + * @return error message + */ + public String getFunctionErrorMessage(final Object obj) { + final String funcDesc = getFunctionDescription(); + return funcDesc != null? funcDesc : ScriptRuntime.safeToString(obj); + } + + /** + * Returns the error message to be used when dyn:call or dyn:new is used on a non-function. + * + * @param desc call site descriptor + * @param obj object on which dyn:call or dyn:new is used + * @return error message + */ + public static String getFunctionErrorMessage(final CallSiteDescriptor desc, final Object obj) { + return desc instanceof NashornCallSiteDescriptor ? + ((NashornCallSiteDescriptor)desc).getFunctionErrorMessage(obj) : + ScriptRuntime.safeToString(obj); + } + + /** * Returns the Nashorn-specific flags for this call site descriptor. * @param desc the descriptor. It can be any kind of a call site descriptor, not necessarily a * {@code NashornCallSiteDescriptor}. This allows for graceful interoperability when linking Nashorn with code * generated outside of Nashorn. * @return the Nashorn-specific flags for the call site, or 0 if the passed descriptor is not a Nashorn call site
< prev index next >