137 */ |
137 */ |
138 Item makeStaticItem(Symbol member) { |
138 Item makeStaticItem(Symbol member) { |
139 return new StaticItem(member); |
139 return new StaticItem(member); |
140 } |
140 } |
141 |
141 |
|
142 /** Make an item representing a dynamically invoked method. |
|
143 * @param member The represented symbol. |
|
144 */ |
|
145 Item makeDynamicItem(Symbol member) { |
|
146 return new DynamicItem(member); |
|
147 } |
|
148 |
142 /** Make an item representing an instance variable or method. |
149 /** Make an item representing an instance variable or method. |
143 * @param member The represented symbol. |
150 * @param member The represented symbol. |
144 * @param nonvirtual Is the reference not virtual? (true for constructors |
151 * @param nonvirtual Is the reference not virtual? (true for constructors |
145 * and private members). |
152 * and private members). |
146 */ |
153 */ |
454 |
461 |
455 public String toString() { |
462 public String toString() { |
456 return "static(" + member + ")"; |
463 return "static(" + member + ")"; |
457 } |
464 } |
458 } |
465 } |
|
466 |
|
467 /** An item representing a dynamic call site. |
|
468 */ |
|
469 class DynamicItem extends StaticItem { |
|
470 DynamicItem(Symbol member) { |
|
471 super(member); |
|
472 assert member.owner == syms.invokeDynamicType.tsym; |
|
473 } |
|
474 |
|
475 Item load() { |
|
476 assert false; |
|
477 return null; |
|
478 } |
|
479 |
|
480 void store() { |
|
481 assert false; |
|
482 } |
|
483 |
|
484 Item invoke() { |
|
485 // assert target.hasNativeInvokeDynamic(); |
|
486 MethodType mtype = (MethodType)member.erasure(types); |
|
487 int rescode = Code.typecode(mtype.restype); |
|
488 ClassFile.NameAndType descr = new ClassFile.NameAndType(member.name, mtype); |
|
489 code.emitInvokedynamic(pool.put(descr), mtype); |
|
490 return stackItem[rescode]; |
|
491 } |
|
492 |
|
493 public String toString() { |
|
494 return "dynamic(" + member + ")"; |
|
495 } |
|
496 } |
|
497 |
459 |
498 |
460 /** An item representing an instance variable or method. |
499 /** An item representing an instance variable or method. |
461 */ |
500 */ |
462 class MemberItem extends Item { |
501 class MemberItem extends Item { |
463 |
502 |