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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  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.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. setMunger(myMunger);
  251. ResolvedType aspectType = world.fromEclipse(classScope.referenceContext.binding);
  252. ResolvedMember me = myMunger.getInitMethod(aspectType);
  253. this.selector = binding.selector = me.getName().toCharArray();
  254. this.realFieldType = this.binding.returnType;
  255. this.binding.returnType = TypeBinding.VOID;
  256. // ??? all other pieces should already match
  257. return new EclipseTypeMunger(world, myMunger, aspectType, this);
  258. }
  259. private AjAttribute makeAttribute() {
  260. return new AjAttribute.TypeMunger(munger);
  261. }
  262. public void generateCode(ClassScope classScope, ClassFile classFile) {
  263. if (ignoreFurtherInvestigation) {
  264. return;
  265. }
  266. classFile.extraAttributes.add(new EclipseAttributeAdapter(makeAttribute()));
  267. super.generateCode(classScope, classFile);
  268. generateDispatchMethods(classScope, classFile);
  269. // interBinding.reader.generateMethod(this, classScope, classFile);
  270. // interBinding.writer.generateMethod(this, classScope, classFile);
  271. }
  272. private void generateDispatchMethods(ClassScope classScope, ClassFile classFile) {
  273. EclipseFactory world = EclipseFactory.fromScopeLookupEnvironment(classScope);
  274. ResolvedMember sig = munger.getSignature();
  275. UnresolvedType aspectType = world.fromBinding(classScope.referenceContext.binding);
  276. generateDispatchMethod(world, sig, aspectType, classScope, classFile, true);
  277. generateDispatchMethod(world, sig, aspectType, classScope, classFile, false);
  278. }
  279. private void generateDispatchMethod(EclipseFactory world, ResolvedMember sig, UnresolvedType aspectType, ClassScope classScope,
  280. ClassFile classFile, boolean isGetter) {
  281. MethodBinding binding;
  282. if (isGetter) {
  283. binding = world.makeMethodBinding(AjcMemberMaker.interFieldGetDispatcher(sig, aspectType),
  284. munger.getTypeVariableAliases(), munger.getSignature().getDeclaringType());
  285. } else {
  286. binding = world.makeMethodBinding(AjcMemberMaker.interFieldSetDispatcher(sig, aspectType),
  287. munger.getTypeVariableAliases(), munger.getSignature().getDeclaringType());
  288. }
  289. classFile.generateMethodInfoHeader(binding);
  290. int methodAttributeOffset = classFile.contentsOffset;
  291. int attributeNumber = classFile.generateMethodInfoAttributes(binding, makeEffectiveSignatureAttribute(sig, isGetter ? Shadow.FieldGet : Shadow.FieldSet, false));
  292. int codeAttributeOffset = classFile.contentsOffset;
  293. classFile.generateCodeAttributeHeader();
  294. CodeStream codeStream = classFile.codeStream;
  295. codeStream.reset(this, classFile);
  296. NewFieldTypeMunger fieldMunger = (NewFieldTypeMunger) munger;
  297. // Force use of version 1 if there is a field with that name on the type already
  298. if (world.getItdVersion() == 1) {
  299. fieldMunger.version = NewFieldTypeMunger.VersionOne;
  300. } else {
  301. if (!onTypeBinding.isInterface()) {
  302. FieldBinding[] existingFields = onTypeBinding.fields();
  303. for (int f = 0; f < existingFields.length; f++) {
  304. FieldBinding fieldBinding = existingFields[f];
  305. if (CharOperation.equals(fieldBinding.name, sig.getName().toCharArray())) {
  306. fieldMunger.version = NewFieldTypeMunger.VersionOne;
  307. }
  308. }
  309. }
  310. }
  311. FieldBinding classField = world.makeFieldBinding(
  312. AjcMemberMaker.interFieldClassField(sig, aspectType, fieldMunger.version == NewFieldTypeMunger.VersionTwo),
  313. munger.getTypeVariableAliases());
  314. codeStream.initializeMaxLocals(binding);
  315. if (isGetter) {
  316. if (onTypeBinding.isInterface()) {
  317. UnresolvedType declaringTX = sig.getDeclaringType();
  318. ResolvedType declaringRTX = world.getWorld().resolve(declaringTX, munger.getSourceLocation());
  319. MethodBinding readMethod = world.makeMethodBinding(
  320. AjcMemberMaker.interFieldInterfaceGetter(sig, declaringRTX, aspectType), munger.getTypeVariableAliases());
  321. generateInterfaceReadBody(binding, readMethod, codeStream);
  322. } else {
  323. generateClassReadBody(binding, classField, codeStream);
  324. }
  325. } else {
  326. if (onTypeBinding.isInterface()) {
  327. MethodBinding writeMethod = world.makeMethodBinding(
  328. AjcMemberMaker.interFieldInterfaceSetter(sig,
  329. world.getWorld().resolve(sig.getDeclaringType(), munger.getSourceLocation()), aspectType),
  330. munger.getTypeVariableAliases());
  331. generateInterfaceWriteBody(binding, writeMethod, codeStream);
  332. } else {
  333. generateClassWriteBody(binding, classField, codeStream);
  334. }
  335. }
  336. AstUtil.generateReturn(binding.returnType, codeStream);
  337. classFile.completeCodeAttribute(codeAttributeOffset);
  338. attributeNumber++;
  339. classFile.completeMethodInfo(binding,methodAttributeOffset, attributeNumber);
  340. }
  341. private void generateInterfaceReadBody(MethodBinding binding, MethodBinding readMethod, CodeStream codeStream) {
  342. codeStream.aload_0();
  343. codeStream.invoke(Opcodes.OPC_invokeinterface,readMethod,null);
  344. }
  345. private void generateInterfaceWriteBody(MethodBinding binding, MethodBinding writeMethod, CodeStream codeStream) {
  346. codeStream.aload_0();
  347. codeStream.load(writeMethod.parameters[0], 1);
  348. codeStream.invoke(Opcodes.OPC_invokeinterface, writeMethod, null);
  349. }
  350. private void generateClassReadBody(MethodBinding binding, FieldBinding field, CodeStream codeStream) {
  351. if (field.isPrivate() || !field.canBeSeenBy(binding.declaringClass.fPackage)) {
  352. PrivilegedHandler handler = (PrivilegedHandler) Scope.findPrivilegedHandler(binding.declaringClass);
  353. if (handler == null) {
  354. // one is now required!
  355. ReferenceBinding typebinding = binding.declaringClass;
  356. if (typebinding instanceof ReferenceBinding) {
  357. SourceTypeBinding sourceBinding = (SourceTypeBinding) typebinding;
  358. handler = new PrivilegedHandler((AspectDeclaration) sourceBinding.scope.referenceContext);
  359. sourceBinding.privilegedHandler = handler;
  360. }
  361. }
  362. PrivilegedFieldBinding fBinding = (PrivilegedFieldBinding) handler.getPrivilegedAccessField(field, null);
  363. if (field.isStatic()) {
  364. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.reader,null);
  365. } else {
  366. codeStream.aload_0();
  367. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.reader,null);
  368. }
  369. return;
  370. }
  371. if (field.isStatic()) {
  372. codeStream.fieldAccess(Opcodes.OPC_getstatic,field,null);
  373. } else {
  374. codeStream.aload_0();
  375. codeStream.fieldAccess(Opcodes.OPC_getfield,field,null);
  376. }
  377. }
  378. private void generateClassWriteBody(MethodBinding binding, FieldBinding field, CodeStream codeStream) {
  379. if (field.isPrivate() || !field.canBeSeenBy(binding.declaringClass.fPackage)) {
  380. PrivilegedFieldBinding fBinding = (PrivilegedFieldBinding) Scope.findPrivilegedHandler(binding.declaringClass)
  381. .getPrivilegedAccessField(field, null);
  382. if (field.isStatic()) {
  383. codeStream.load(field.type, 0);
  384. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.writer,null);
  385. } else {
  386. codeStream.aload_0();
  387. codeStream.load(field.type, 1);
  388. codeStream.invoke(Opcodes.OPC_invokestatic,fBinding.writer,null);
  389. }
  390. return;
  391. }
  392. if (field.isStatic()) {
  393. codeStream.load(field.type, 0);
  394. codeStream.fieldAccess(Opcodes.OPC_putstatic,field,null);
  395. } else {
  396. codeStream.aload_0();
  397. codeStream.load(field.type, 1);
  398. codeStream.fieldAccess(Opcodes.OPC_putfield,field,null);
  399. }
  400. }
  401. protected Shadow.Kind getShadowKindForBody() {
  402. return null;
  403. }
  404. }