lastGenericCast = null;
LocalVariableBinding localBinding = (LocalVariableBinding) this.binding;
lastReceiverType = localBinding.type;
if (!needValue) break; // no value needed
// regular local variable read
Constant localConstant = localBinding.constant();
if (localConstant != Constant.NotAConstant) {
codeStream.generateConstant(localConstant, 0);
// no implicit conversion
} else {
// outer local?
if ((this.bits & ASTNode.DepthMASK) != 0) {
// outer local can be reached either through a synthetic arg or a synthetic field
VariableBinding[] path = currentScope.getEmulationPath(localBinding);
codeStream.generateOuterAccess(path, this, localBinding, currentScope);
} else {
codeStream.load(localBinding);
}
}
break;
default : // should not occur
return null;
}
// all intermediate field accesses are read accesses
// only the last field binding is a write access
int positionsLength = this.sourcePositions.length;
FieldBinding initialFieldBinding = lastFieldBinding; // can be null if initial was a local binding
if (this.otherBindings != null) {
for (int i = 0; i < otherBindingsCount; i++) {
int pc = codeStream.position;
FieldBinding nextField = this.otherBindings[i].original();
TypeBinding nextGenericCast = this.otherGenericCasts == null ? null : this.otherGenericCasts[i];
if (lastFieldBinding != null) {
needValue = !nextField.isStatic();
Constant fieldConstant = lastFieldBinding.constant();
if (fieldConstant != Constant.NotAConstant) {
if (i > 0 && !lastFieldBinding.isStatic()) {
codeStream.invokeObjectGetClass(); // perform null check
codeStream.pop();
}