Lines 53-58
Link Here
|
53 |
public void generateAssignment(BlockScope currentScope, CodeStream codeStream, Assignment assignment, boolean valueRequired) { |
53 |
public void generateAssignment(BlockScope currentScope, CodeStream codeStream, Assignment assignment, boolean valueRequired) { |
54 |
int pc = codeStream.position; |
54 |
int pc = codeStream.position; |
55 |
this.receiver.generateCode(currentScope, codeStream, true); |
55 |
this.receiver.generateCode(currentScope, codeStream, true); |
|
|
56 |
if (this.receiver instanceof CastExpression // ((type[])null)[0] |
57 |
&& ((CastExpression)this.receiver).innermostCastedExpression().resolvedType == TypeBinding.NULL){ |
58 |
codeStream.checkcast(this.receiver.resolvedType); |
59 |
} |
56 |
codeStream.recordPositionsFrom(pc, this.sourceStart); |
60 |
codeStream.recordPositionsFrom(pc, this.sourceStart); |
57 |
this.position.generateCode(currentScope, codeStream, true); |
61 |
this.position.generateCode(currentScope, codeStream, true); |
58 |
assignment.expression.generateCode(currentScope, codeStream, true); |
62 |
assignment.expression.generateCode(currentScope, codeStream, true); |
Lines 68-73
Link Here
|
68 |
public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) { |
72 |
public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) { |
69 |
int pc = codeStream.position; |
73 |
int pc = codeStream.position; |
70 |
this.receiver.generateCode(currentScope, codeStream, true); |
74 |
this.receiver.generateCode(currentScope, codeStream, true); |
|
|
75 |
if (this.receiver instanceof CastExpression // ((type[])null)[0] |
76 |
&& ((CastExpression)this.receiver).innermostCastedExpression().resolvedType == TypeBinding.NULL){ |
77 |
codeStream.checkcast(this.receiver.resolvedType); |
78 |
} |
71 |
this.position.generateCode(currentScope, codeStream, true); |
79 |
this.position.generateCode(currentScope, codeStream, true); |
72 |
codeStream.arrayAt(this.resolvedType.id); |
80 |
codeStream.arrayAt(this.resolvedType.id); |
73 |
// Generating code for the potential runtime type checking |
81 |
// Generating code for the potential runtime type checking |
Lines 91-96
Link Here
|
91 |
|
99 |
|
92 |
public void generateCompoundAssignment(BlockScope currentScope, CodeStream codeStream, Expression expression, int operator, int assignmentImplicitConversion, boolean valueRequired) { |
100 |
public void generateCompoundAssignment(BlockScope currentScope, CodeStream codeStream, Expression expression, int operator, int assignmentImplicitConversion, boolean valueRequired) { |
93 |
this.receiver.generateCode(currentScope, codeStream, true); |
101 |
this.receiver.generateCode(currentScope, codeStream, true); |
|
|
102 |
if (this.receiver instanceof CastExpression // ((type[])null)[0] |
103 |
&& ((CastExpression)this.receiver).innermostCastedExpression().resolvedType == TypeBinding.NULL){ |
104 |
codeStream.checkcast(this.receiver.resolvedType); |
105 |
} |
94 |
this.position.generateCode(currentScope, codeStream, true); |
106 |
this.position.generateCode(currentScope, codeStream, true); |
95 |
codeStream.dup2(); |
107 |
codeStream.dup2(); |
96 |
codeStream.arrayAt(this.resolvedType.id); |
108 |
codeStream.arrayAt(this.resolvedType.id); |
Lines 120-125
Link Here
|
120 |
|
132 |
|
121 |
public void generatePostIncrement(BlockScope currentScope, CodeStream codeStream, CompoundAssignment postIncrement, boolean valueRequired) { |
133 |
public void generatePostIncrement(BlockScope currentScope, CodeStream codeStream, CompoundAssignment postIncrement, boolean valueRequired) { |
122 |
this.receiver.generateCode(currentScope, codeStream, true); |
134 |
this.receiver.generateCode(currentScope, codeStream, true); |
|
|
135 |
if (this.receiver instanceof CastExpression // ((type[])null)[0] |
136 |
&& ((CastExpression)this.receiver).innermostCastedExpression().resolvedType == TypeBinding.NULL){ |
137 |
codeStream.checkcast(this.receiver.resolvedType); |
138 |
} |
123 |
this.position.generateCode(currentScope, codeStream, true); |
139 |
this.position.generateCode(currentScope, codeStream, true); |
124 |
codeStream.dup2(); |
140 |
codeStream.dup2(); |
125 |
codeStream.arrayAt(this.resolvedType.id); |
141 |
codeStream.arrayAt(this.resolvedType.id); |
Lines 155-160
Link Here
|
155 |
|
171 |
|
156 |
public TypeBinding resolveType(BlockScope scope) { |
172 |
public TypeBinding resolveType(BlockScope scope) { |
157 |
this.constant = Constant.NotAConstant; |
173 |
this.constant = Constant.NotAConstant; |
|
|
174 |
if (this.receiver instanceof CastExpression // no cast check for ((type[])null)[0] |
175 |
&& ((CastExpression)this.receiver).innermostCastedExpression() instanceof NullLiteral) { |
176 |
this.receiver.bits |= ASTNode.DisableUnnecessaryCastCheck; // will check later on |
177 |
} |
158 |
TypeBinding arrayType = this.receiver.resolveType(scope); |
178 |
TypeBinding arrayType = this.receiver.resolveType(scope); |
159 |
if (arrayType != null) { |
179 |
if (arrayType != null) { |
160 |
this.receiver.computeConversion(scope, arrayType, arrayType); |
180 |
this.receiver.computeConversion(scope, arrayType, arrayType); |