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.

InterTypeFieldDeclaration.java 22KB

21 years ago
4 years ago
4 years ago
4 years ago
21 years ago
21 years ago
4 years ago
4 years ago
21 years ago
18 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
4 years ago
4 years ago
4 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
18 years ago
4 years ago
4 years ago
21 years ago
21 years ago
21 years ago
21 years ago
21 years ago
18 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
4 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
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  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.ajdt.internal.compiler.ast;
  13. import java.lang.reflect.Modifier;
  14. import org.aspectj.ajdt.internal.compiler.lookup.EclipseFactory;
  15. import org.aspectj.ajdt.internal.compiler.lookup.EclipseTypeMunger;
  16. import org.aspectj.ajdt.internal.compiler.lookup.PrivilegedFieldBinding;
  17. import org.aspectj.ajdt.internal.compiler.lookup.PrivilegedHandler;
  18. import org.aspectj.org.eclipse.jdt.core.compiler.CharOperation;
  19. import org.aspectj.org.eclipse.jdt.internal.compiler.ClassFile;
  20. import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
  21. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
  22. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
  23. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;
  24. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
  25. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
  26. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
  27. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
  28. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
  29. import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.CodeStream;
  30. import org.aspectj.org.eclipse.jdt.internal.compiler.codegen.Opcodes;
  31. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ArrayBinding;
  32. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope;
  33. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
  34. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
  35. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
  36. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
  37. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
  38. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
  39. import org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser;
  40. import org.aspectj.weaver.AjAttribute;
  41. import org.aspectj.weaver.AjcMemberMaker;
  42. import org.aspectj.weaver.Member;
  43. import org.aspectj.weaver.NameMangler;
  44. import org.aspectj.weaver.NewFieldTypeMunger;
  45. import org.aspectj.weaver.ResolvedMember;
  46. import org.aspectj.weaver.ResolvedMemberImpl;
  47. import org.aspectj.weaver.ResolvedType;
  48. import org.aspectj.weaver.Shadow;
  49. import org.aspectj.weaver.UnresolvedType;
  50. /**
  51. * An inter-type field declaration.
  52. *
  53. * returnType encodes the type of the field selector encodes the name statements is null until resolution when it is filled in from
  54. * the initializer
  55. *
  56. * @author Jim Hugunin
  57. */
  58. public class InterTypeFieldDeclaration extends InterTypeDeclaration {
  59. public Expression initialization;
  60. private TypeBinding realFieldType;
  61. // public InterTypeFieldBinding interBinding;
  62. public InterTypeFieldDeclaration(CompilationResult result, TypeReference onType) {
  63. super(result, onType);
  64. }
  65. public TypeBinding getRealFieldType() {
  66. return realFieldType;
  67. }
  68. public void parseStatements(Parser parser, CompilationUnitDeclaration unit) {
  69. // we don't have a body to parse
  70. }
  71. protected char[] getPrefix() {
  72. return (NameMangler.ITD_PREFIX + "interField$").toCharArray();
  73. }
  74. public void resolveOnType(ClassScope classScope) {
  75. super.resolveOnType(classScope);
  76. if (ignoreFurtherInvestigation) {
  77. return;
  78. }
  79. if (Modifier.isStatic(declaredModifiers) && onTypeBinding.isInterface()) {
  80. scope.problemReporter().signalError(sourceStart, sourceEnd, "static inter-type field on interface not supported");
  81. ignoreFurtherInvestigation = true;
  82. }
  83. if (Modifier.isStatic(declaredModifiers) && typeVariableAliases != null && typeVariableAliases.size() > 0
  84. && onTypeBinding.isGenericType()) {
  85. scope.problemReporter().signalError(sourceStart, sourceEnd,
  86. "static intertype field declarations cannot refer to type variables from the target generic type");
  87. }
  88. }
  89. public void resolve(ClassScope upperScope) {
  90. if (munger == null) {
  91. ignoreFurtherInvestigation = true;
  92. }
  93. if (ignoreFurtherInvestigation) {
  94. return;
  95. }
  96. EclipseFactory world = EclipseFactory.fromScopeLookupEnvironment(upperScope);
  97. ResolvedMember sig = munger.getSignature();
  98. UnresolvedType aspectType = world.fromBinding(upperScope.referenceContext.binding);
  99. if (sig.getReturnType().equals(UnresolvedType.VOID)
  100. || (sig.getReturnType().isArray() && (sig.getReturnType().getComponentType().equals(UnresolvedType.VOID)))) {
  101. upperScope.problemReporter().signalError(sourceStart, sourceEnd, "field type can not be void");
  102. }
  103. //
  104. // System.err.println("sig: " + sig);
  105. // System.err.println("field: " + world.makeFieldBinding(
  106. // AjcMemberMaker.interFieldClassField(sig, aspectType)));
  107. if (initialization != null && initialization instanceof ArrayInitializer) {
  108. // System.err.println("got initializer: " + initialization);
  109. ArrayAllocationExpression aae = new ArrayAllocationExpression();
  110. aae.initializer = (ArrayInitializer) initialization;
  111. ArrayBinding arrayType = (ArrayBinding) world.makeTypeBinding(sig.getReturnType());
  112. aae.type = AstUtil.makeTypeReference(arrayType.leafComponentType());
  113. aae.sourceStart = initialization.sourceStart;
  114. aae.sourceEnd = initialization.sourceEnd;
  115. aae.dimensions = new Expression[arrayType.dimensions];
  116. initialization = aae;
  117. } /*
  118. * else if (initialization!=null) { MethodScope initializationScope = this.scope; TypeBinding fieldType = realFieldType;
  119. * TypeBinding initializationType; this.initialization.setExpectedType(fieldType); // needed in case of generic method
  120. * invocation if (this.initialization instanceof ArrayInitializer) {
  121. *
  122. * if ((initializationType = this.initialization.resolveTypeExpecting(initializationScope, fieldType)) != null) {
  123. * ((ArrayInitializer) this.initialization).binding = (ArrayBinding) initializationType;
  124. * this.initialization.computeConversion(initializationScope, fieldType, initializationType); } } //
  125. * System.err.println("i=>"+initialization); // System.err.println("sasuages=>"+initialization.resolvedType); //
  126. * //initializationType = initialization.resolveType(initializationScope); //
  127. * System.err.println("scope=>"+initializationScope);
  128. *
  129. * else if ((initializationType = this.initialization.resolveType(initializationScope)) != null) {
  130. *
  131. * if (fieldType != initializationType) // must call before computeConversion() and typeMismatchError()
  132. * initializationScope.compilationUnitScope().recordTypeConversion(fieldType, initializationType); if
  133. * (this.initialization.isConstantValueOfTypeAssignableToType(initializationType, fieldType) || (fieldType.isBaseType() &&
  134. * BaseTypeBinding.isWidening(fieldType.id, initializationType.id)) || initializationType.isCompatibleWith(fieldType)) {
  135. * initialization.computeConversion(initializationScope, fieldType, initializationType); if
  136. * (initializationType.needsUncheckedConversion(fieldType)) {
  137. * initializationScope.problemReporter().unsafeTypeConversion(this.initialization, initializationType, fieldType); } } else
  138. * if (initializationScope.isBoxingCompatibleWith(initializationType, fieldType) || (initializationType.isBaseType() //
  139. * narrowing then boxing ? && initializationScope.compilerOptions().sourceLevel >= JDK1_5 // autoboxing &&
  140. * !fieldType.isBaseType() && initialization.isConstantValueOfTypeAssignableToType(initializationType,
  141. * initializationScope.environment().computeBoxingType(fieldType)))) {
  142. * this.initialization.computeConversion(initializationScope, fieldType, initializationType); } else {
  143. * initializationScope.problemReporter().typeMismatchError(initializationType, fieldType, this); } // if
  144. * (this.binding.isFinal()){ // cast from constant actual type to variable type //
  145. * this.binding.setConstant(this.initialization.constant.castTo((this.binding.returnType.id << 4) +
  146. * this.initialization.constant.typeID())); // } // } else { // this.binding.setConstant(NotAConstant); } // }
  147. */
  148. // ////////////////////
  149. if (initialization == null) {
  150. this.statements = new Statement[] { new ReturnStatement(null, 0, 0), };
  151. } else if (!onTypeBinding.isInterface()) {
  152. MethodBinding writeMethod = world.makeMethodBinding(AjcMemberMaker.interFieldSetDispatcher(sig, aspectType),
  153. munger.getTypeVariableAliases());
  154. // For the body of an intertype field initalizer, generate a call to the inter field set dispatcher
  155. // method as that casts the shadow of a field set join point.
  156. if (Modifier.isStatic(declaredModifiers)) {
  157. this.statements = new Statement[] { new KnownMessageSend(writeMethod,
  158. AstUtil.makeNameReference(writeMethod.declaringClass), new Expression[] { initialization }), };
  159. } else {
  160. this.statements = new Statement[] { new KnownMessageSend(writeMethod,
  161. AstUtil.makeNameReference(writeMethod.declaringClass), new Expression[] {
  162. AstUtil.makeLocalVariableReference(arguments[0].binding), initialization }), };
  163. }
  164. } else {
  165. // XXX something is broken about this logic. Can we write to static interface fields?
  166. MethodBinding writeMethod = world.makeMethodBinding(
  167. AjcMemberMaker.interFieldInterfaceSetter(sig, sig.getDeclaringType().resolve(world.getWorld()), aspectType),
  168. munger.getTypeVariableAliases());
  169. if (Modifier.isStatic(declaredModifiers)) {
  170. this.statements = new Statement[] { new KnownMessageSend(writeMethod,
  171. AstUtil.makeNameReference(writeMethod.declaringClass), new Expression[] { initialization }), };
  172. } else {
  173. this.statements = new Statement[] { new KnownMessageSend(writeMethod,
  174. AstUtil.makeLocalVariableReference(arguments[0].binding), new Expression[] { initialization }), };
  175. }
  176. }
  177. super.resolve(upperScope);
  178. }
  179. public void setInitialization(Expression initialization) {
  180. this.initialization = initialization;
  181. }
  182. /*
  183. * public void resolveStatements() { super.resolveStatements();
  184. *
  185. * // if (initialization!=null) { // MethodScope initializationScope = this.scope; // TypeBinding fieldType = realFieldType; //
  186. * TypeBinding initializationType; // this.initialization.setExpectedType(fieldType); // needed in case of generic method
  187. * invocation // if (this.initialization instanceof ArrayInitializer) { // // if ((initializationType =
  188. * this.initialization.resolveTypeExpecting(initializationScope, fieldType)) != null) { // ((ArrayInitializer)
  189. * this.initialization).binding = (ArrayBinding) initializationType; //
  190. * this.initialization.computeConversion(initializationScope, fieldType, initializationType); // } // } ////
  191. * System.err.println("i=>"+initialization); //// System.err.println("sasuages=>"+initialization.resolvedType); ////
  192. * //initializationType = initialization.resolveType(initializationScope); ////
  193. * System.err.println("scope=>"+initializationScope); // // else if ((initializationType =
  194. * this.initialization.resolveType(initializationScope)) != null) { // // if (fieldType != initializationType) // must call
  195. * before computeConversion() and typeMismatchError() //
  196. * initializationScope.compilationUnitScope().recordTypeConversion(fieldType, initializationType); // if
  197. * (this.initialization.isConstantValueOfTypeAssignableToType(initializationType, fieldType) // || (fieldType.isBaseType() &&
  198. * BaseTypeBinding.isWidening(fieldType.id, initializationType.id)) // || initializationType.isCompatibleWith(fieldType)) { //
  199. * initialization.computeConversion(initializationScope, fieldType, initializationType); // if
  200. * (initializationType.needsUncheckedConversion(fieldType)) { //
  201. * initializationScope.problemReporter().unsafeTypeConversion(this.initialization, initializationType, fieldType); // } // }
  202. * else if (initializationScope.isBoxingCompatibleWith(initializationType, fieldType) // || (initializationType.isBaseType() //
  203. * narrowing then boxing ? // && initializationScope.compilerOptions().sourceLevel >= JDK1_5 // autoboxing // &&
  204. * !fieldType.isBaseType() // && initialization.isConstantValueOfTypeAssignableToType(initializationType,
  205. * initializationScope.environment().computeBoxingType(fieldType)))) { //
  206. * this.initialization.computeConversion(initializationScope, fieldType, initializationType); // } else { //
  207. * initializationScope.problemReporter().typeMismatchError(initializationType, fieldType, this); // } // // if
  208. * (this.binding.isFinal()){ // cast from constant actual type to variable type // //
  209. * this.binding.setConstant(this.initialization.constant.castTo((this.binding.returnType.id << 4) +
  210. * this.initialization.constant.typeID())); // // } // // } else { // // this.binding.setConstant(NotAConstant); // }}
  211. *
  212. * }
  213. */
  214. public EclipseTypeMunger build(ClassScope classScope) {
  215. EclipseFactory world = EclipseFactory.fromScopeLookupEnvironment(classScope);
  216. resolveOnType(classScope);
  217. if (ignoreFurtherInvestigation) {
  218. return null;
  219. }
  220. binding = classScope.referenceContext.binding.resolveTypesFor(binding);
  221. if (ignoreFurtherInvestigation) {
  222. return null;
  223. }
  224. if (isTargetAnnotation(classScope, "field")) {
  225. return null; // Error message output in isTargetAnnotation
  226. }
  227. if (isTargetEnum(classScope, "field")) {
  228. return null; // Error message output in isTargetEnum
  229. }
  230. if (!Modifier.isStatic(declaredModifiers)) {
  231. super.binding.parameters = new TypeBinding[] { onTypeBinding, };
  232. this.arguments = new Argument[] { AstUtil.makeFinalArgument("ajc$this_".toCharArray(), onTypeBinding), };
  233. }
  234. // System.err.println("type: " + binding.returnType + ", " + returnType);
  235. ResolvedType declaringType = world.fromBinding(onTypeBinding).resolve(world.getWorld());
  236. if (declaringType.isRawType() || declaringType.isParameterizedType()) {
  237. declaringType = declaringType.getGenericType();
  238. }
  239. if (interTypeScope == null) {
  240. return null; // We encountered a problem building the scope, don't continue - error already reported
  241. }
  242. // Build a half correct resolvedmember (makeResolvedMember understands tvars) then build a fully correct sig from it
  243. ResolvedMember sigtemp = world.makeResolvedMemberForITD(binding, onTypeBinding, interTypeScope.getRecoveryAliases());
  244. UnresolvedType returnType = sigtemp.getReturnType();
  245. // if (returnType.isParameterizedType() || returnType.isGenericType()) returnType = returnType.getRawType();
  246. ResolvedMember sig = new ResolvedMemberImpl(Member.FIELD, declaringType, declaredModifiers, returnType, new String(
  247. declaredSelector), UnresolvedType.NONE);
  248. sig.setTypeVariables(sigtemp.getTypeVariables());
  249. NewFieldTypeMunger myMunger = new NewFieldTypeMunger(sig, null, typeVariableAliases);
  250. if (world.getItdVersion() == 1) {
  251. myMunger.version = NewFieldTypeMunger.VersionOne;
  252. }
  253. setMunger(myMunger);
  254. ResolvedType aspectType = world.fromEclipse(classScope.referenceContext.binding);
  255. ResolvedMember me = myMunger.getInitMethod(aspectType);
  256. this.selector = binding.selector = me.getName().toCharArray();
  257. this.realFieldType = this.binding.returnType;
  258. this.binding.returnType = TypeBinding.VOID;
  259. // ??? all other pieces should already match
  260. return new EclipseTypeMunger(world, myMunger, aspectType, this);
  261. }
  262. private AjAttribute makeAttribute() {
  263. return new AjAttribute.TypeMunger(munger);
  264. }
  265. public void generateCode(ClassScope classScope, ClassFile classFile) {
  266. if (ignoreFurtherInvestigation) {
  267. return;
  268. }
  269. classFile.extraAttributes.add(new EclipseAttributeAdapter(makeAttribute()));
  270. super.generateCode(classScope, classFile);
  271. generateDispatchMethods(classScope, classFile);
  272. // interBinding.reader.generateMethod(this, classScope, classFile);
  273. // interBinding.writer.generateMethod(this, classScope, classFile);
  274. }
  275. private void generateDispatchMethods(ClassScope classScope, ClassFile classFile) {
  276. EclipseFactory world = EclipseFactory.fromScopeLookupEnvironment(classScope);
  277. ResolvedMember sig = munger.getSignature();
  278. UnresolvedType aspectType = world.fromBinding(classScope.referenceContext.binding);
  279. generateDispatchMethod(world, sig, aspectType, classScope, classFile, true);
  280. generateDispatchMethod(world, sig, aspectType, classScope, classFile, false);
  281. }
  282. private void generateDispatchMethod(EclipseFactory world, ResolvedMember sig, UnresolvedType aspectType, ClassScope classScope,
  283. ClassFile classFile, boolean isGetter) {
  284. MethodBinding binding;
  285. if (isGetter) {
  286. binding = world.makeMethodBinding(AjcMemberMaker.interFieldGetDispatcher(sig, aspectType),
  287. munger.getTypeVariableAliases(), munger.getSignature().getDeclaringType());
  288. } else {
  289. binding = world.makeMethodBinding(AjcMemberMaker.interFieldSetDispatcher(sig, aspectType),
  290. munger.getTypeVariableAliases(), munger.getSignature().getDeclaringType());
  291. }
  292. classFile.generateMethodInfoHeader(binding);
  293. int methodAttributeOffset = classFile.contentsOffset;
  294. int attributeNumber = classFile.generateMethodInfoAttributes(binding, makeEffectiveSignatureAttribute(sig, isGetter ? Shadow.FieldGet : Shadow.FieldSet, false));
  295. int codeAttributeOffset = classFile.contentsOffset;
  296. classFile.generateCodeAttributeHeader();
  297. CodeStream codeStream = classFile.codeStream;
  298. codeStream.reset(this, classFile);
  299. NewFieldTypeMunger fieldMunger = (NewFieldTypeMunger) munger;
  300. // Force use of version 1 if there is a field with that name on the type already
  301. if (world.getItdVersion() == 1) {
  302. fieldMunger.version = NewFieldTypeMunger.VersionOne;
  303. } else {
  304. if (!onTypeBinding.isInterface()) {
  305. FieldBinding[] existingFields = onTypeBinding.fields();
  306. for (FieldBinding fieldBinding : existingFields) {
  307. if (CharOperation.equals(fieldBinding.name, sig.getName().toCharArray())) {
  308. fieldMunger.version = NewFieldTypeMunger.VersionOne;
  309. }
  310. }
  311. }
  312. }
  313. FieldBinding classField = world.makeFieldBinding(
  314. AjcMemberMaker.interFieldClassField(sig, aspectType, fieldMunger.version == NewFieldTypeMunger.VersionTwo),
  315. munger.getTypeVariableAliases());
  316. codeStream.initializeMaxLocals(binding);
  317. if (isGetter) {
  318. if (onTypeBinding.isInterface()) {
  319. UnresolvedType declaringTX = sig.getDeclaringType();
  320. ResolvedType declaringRTX = world.getWorld().resolve(declaringTX, munger.getSourceLocation());
  321. MethodBinding readMethod = world.makeMethodBinding(
  322. AjcMemberMaker.interFieldInterfaceGetter(sig, declaringRTX, aspectType), munger.getTypeVariableAliases());
  323. generateInterfaceReadBody(binding, readMethod, codeStream);
  324. } else {
  325. generateClassReadBody(binding, classField, codeStream);
  326. }
  327. } else {
  328. if (onTypeBinding.isInterface()) {
  329. MethodBinding writeMethod = world.makeMethodBinding(
  330. AjcMemberMaker.interFieldInterfaceSetter(sig,
  331. world.getWorld().resolve(sig.getDeclaringType(), munger.getSourceLocation()), aspectType),
  332. munger.getTypeVariableAliases());
  333. generateInterfaceWriteBody(binding, writeMethod, codeStream);
  334. } else {
  335. generateClassWriteBody(binding, classField, codeStream);
  336. }
  337. }
  338. AstUtil.generateReturn(binding.returnType, codeStream);
  339. classFile.completeCodeAttribute(codeAttributeOffset,scope);
  340. attributeNumber++;
  341. classFile.completeMethodInfo(binding,methodAttributeOffset, attributeNumber);
  342. }
  343. private void generateInterfaceReadBody(MethodBinding binding, MethodBinding readMethod, CodeStream codeStream) {
  344. codeStream.aload_0();
  345. codeStream.invoke(Opcodes.OPC_invokeinterface,readMethod,null);
  346. }
  347. private void generateInterfaceWriteBody(MethodBinding binding, MethodBinding writeMethod, CodeStream codeStream) {
  348. codeStream.aload_0();
  349. codeStream.load(writeMethod.parameters[0], 1);
  350. codeStream.invoke(Opcodes.OPC_invokeinterface, writeMethod, null);
  351. }
  352. private void generateClassReadBody(MethodBinding binding, FieldBinding field, CodeStream codeStream) {
  353. if (field.isPrivate() || !field.canBeSeenBy(binding.declaringClass.fPackage)) {
  354. PrivilegedHandler handler = (PrivilegedHandler) Scope.findPrivilegedHandler(binding.declaringClass);
  355. if (handler == null) {
  356. // one is now required!
  357. ReferenceBinding typebinding = binding.declaringClass;
  358. if (typebinding instanceof ReferenceBinding) {
  359. SourceTypeBinding sourceBinding = (SourceTypeBinding) typebinding;
  360. handler = new PrivilegedHandler((AspectDeclaration) sourceBinding.scope.referenceContext);
  361. sourceBinding.privilegedHandler = handler;
  362. }
  363. }
  364. PrivilegedFieldBinding fBinding = (PrivilegedFieldBinding) handler.getPrivilegedAccessField(field, null);
  365. if (field.isStatic()) {
  366. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.reader,null);
  367. } else {
  368. codeStream.aload_0();
  369. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.reader,null);
  370. }
  371. return;
  372. }
  373. if (field.isStatic()) {
  374. codeStream.fieldAccess(Opcodes.OPC_getstatic,field,null);
  375. } else {
  376. codeStream.aload_0();
  377. codeStream.fieldAccess(Opcodes.OPC_getfield,field,null);
  378. }
  379. }
  380. private void generateClassWriteBody(MethodBinding binding, FieldBinding field, CodeStream codeStream) {
  381. if (field.isPrivate() || !field.canBeSeenBy(binding.declaringClass.fPackage)) {
  382. PrivilegedFieldBinding fBinding = (PrivilegedFieldBinding) Scope.findPrivilegedHandler(binding.declaringClass)
  383. .getPrivilegedAccessField(field, null);
  384. if (field.isStatic()) {
  385. codeStream.load(field.type, 0);
  386. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.writer,null);
  387. } else {
  388. codeStream.aload_0();
  389. codeStream.load(field.type, 1);
  390. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.writer,null);
  391. }
  392. return;
  393. }
  394. if (field.isStatic()) {
  395. codeStream.load(field.type, 0);
  396. codeStream.fieldAccess(Opcodes.OPC_putstatic,field,null);
  397. } else {
  398. codeStream.aload_0();
  399. codeStream.load(field.type, 1);
  400. codeStream.fieldAccess(Opcodes.OPC_putfield,field,null);
  401. }
  402. }
  403. protected Shadow.Kind getShadowKindForBody() {
  404. return null;
  405. }
  406. }