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

21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
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 v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  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. }