diff -r 825f23a4f262 -r e2722bd43f3a src/share/classes/com/sun/tools/javac/jvm/Items.java --- a/src/share/classes/com/sun/tools/javac/jvm/Items.java Thu Apr 16 11:23:02 2009 -0700 +++ b/src/share/classes/com/sun/tools/javac/jvm/Items.java Mon May 04 21:04:04 2009 -0700 @@ -139,6 +139,13 @@ return new StaticItem(member); } + /** Make an item representing a dynamically invoked method. + * @param member The represented symbol. + */ + Item makeDynamicItem(Symbol member) { + return new DynamicItem(member); + } + /** Make an item representing an instance variable or method. * @param member The represented symbol. * @param nonvirtual Is the reference not virtual? (true for constructors @@ -457,6 +464,38 @@ } } + /** An item representing a dynamic call site. + */ + class DynamicItem extends StaticItem { + DynamicItem(Symbol member) { + super(member); + assert member.owner == syms.invokeDynamicType.tsym; + } + + Item load() { + assert false; + return null; + } + + void store() { + assert false; + } + + Item invoke() { + // assert target.hasNativeInvokeDynamic(); + MethodType mtype = (MethodType)member.erasure(types); + int rescode = Code.typecode(mtype.restype); + ClassFile.NameAndType descr = new ClassFile.NameAndType(member.name, mtype); + code.emitInvokedynamic(pool.put(descr), mtype); + return stackItem[rescode]; + } + + public String toString() { + return "dynamic(" + member + ")"; + } + } + + /** An item representing an instance variable or method. */ class MemberItem extends Item {