You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

BcelCflowStackFieldAdder.java 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver.bcel;
  13. import org.aspectj.apache.bcel.Constants;
  14. import org.aspectj.apache.bcel.generic.FieldGen;
  15. import org.aspectj.apache.bcel.generic.InstructionFactory;
  16. import org.aspectj.apache.bcel.generic.InstructionList;
  17. import org.aspectj.apache.bcel.generic.Type;
  18. import org.aspectj.weaver.Member;
  19. import org.aspectj.weaver.NameMangler;
  20. import org.aspectj.weaver.ResolvedMember;
  21. import org.aspectj.weaver.ResolvedType;
  22. public class BcelCflowStackFieldAdder extends BcelTypeMunger {
  23. private ResolvedMember cflowStackField;
  24. public BcelCflowStackFieldAdder(ResolvedMember cflowStackField) {
  25. super(null, (ResolvedType) cflowStackField.getDeclaringType());
  26. this.cflowStackField = cflowStackField;
  27. }
  28. @Override
  29. public boolean munge(BcelClassWeaver weaver) {
  30. LazyClassGen gen = weaver.getLazyClassGen();
  31. if (!gen.getType().equals(cflowStackField.getDeclaringType())) {
  32. return false;
  33. }
  34. FieldGen f = new FieldGen(cflowStackField.getModifiers(), BcelWorld.makeBcelType(cflowStackField.getReturnType()),
  35. cflowStackField.getName(), gen.getConstantPool());
  36. gen.addField(f, getSourceLocation());
  37. LazyMethodGen clinit = gen.getAjcPreClinit(); // StaticInitializer();
  38. InstructionList setup = new InstructionList();
  39. InstructionFactory fact = gen.getFactory();
  40. setup.append(fact.createNew(NameMangler.CFLOW_STACK_TYPE));
  41. setup.append(InstructionFactory.createDup(1));
  42. setup.append(fact.createInvoke(NameMangler.CFLOW_STACK_TYPE, "<init>", Type.VOID, Type.NO_ARGS, Constants.INVOKESPECIAL));
  43. setup.append(Utility.createSet(fact, cflowStackField));
  44. clinit.getBody().insert(setup);
  45. return true;
  46. }
  47. @Override
  48. public ResolvedMember getMatchingSyntheticMember(Member member) {
  49. return null;
  50. }
  51. @Override
  52. public ResolvedMember getSignature() {
  53. return cflowStackField;
  54. }
  55. @Override
  56. public boolean matches(ResolvedType onType) {
  57. return onType.equals(cflowStackField.getDeclaringType());
  58. }
  59. @Override
  60. public boolean existsToSupportShadowMunging() {
  61. return true;
  62. }
  63. }