CollectionElement.dupReceiver simplification

This commit is contained in:
mikhael.bogdanov
2014-04-24 12:22:59 +04:00
committed by Mikhael Bogdanov
parent f57bcbb411
commit 629ca66d93
@@ -680,41 +680,30 @@ public abstract class StackValue {
return; return;
} }
int size = 0; FrameMap.Mark mark = frame.mark();
// ugly hack: getting the last variable index
int lastIndex = frame.enterTemp(Type.INT_TYPE);
frame.leaveTemp(Type.INT_TYPE);
// indexes // indexes
List<ValueParameterDescriptor> valueParameters = resolvedGetCall.getResultingDescriptor().getValueParameters(); List<ValueParameterDescriptor> valueParameters = resolvedGetCall.getResultingDescriptor().getValueParameters();
int firstParamIndex = -1; int firstParamIndex = -1;
for (int i = valueParameters.size() - 1; i >= 0; --i) { for (int i = valueParameters.size() - 1; i >= 0; --i) {
Type type = codegen.typeMapper.mapType(valueParameters.get(i).getType()); Type type = codegen.typeMapper.mapType(valueParameters.get(i).getType());
int sz = type.getSize(); firstParamIndex = frame.enterTemp(type);
frame.enterTemp(type); v.store(firstParamIndex, type);
lastIndex += sz;
size += sz;
v.store((firstParamIndex = lastIndex) - sz, type);
} }
ReceiverValue receiverParameter = resolvedGetCall.getReceiverArgument(); ReceiverValue receiverParameter = resolvedGetCall.getReceiverArgument();
int receiverIndex = -1; int receiverIndex = -1;
if (receiverParameter.exists()) { if (receiverParameter.exists()) {
Type type = codegen.typeMapper.mapType(receiverParameter.getType()); Type type = codegen.typeMapper.mapType(receiverParameter.getType());
int sz = type.getSize(); receiverIndex = frame.enterTemp(type);
frame.enterTemp(type); v.store(receiverIndex, type);
lastIndex += sz;
size += sz;
v.store((receiverIndex = lastIndex) - sz, type);
} }
ReceiverValue thisObject = resolvedGetCall.getThisObject(); ReceiverValue thisObject = resolvedGetCall.getThisObject();
int thisIndex = -1; int thisIndex = -1;
if (thisObject.exists()) { if (thisObject.exists()) {
frame.enterTemp(OBJECT_TYPE); thisIndex = frame.enterTemp(OBJECT_TYPE);
lastIndex++; v.store(thisIndex, OBJECT_TYPE);
size++;
v.store((thisIndex = lastIndex) - 1, OBJECT_TYPE);
} }
// for setter // for setter
@@ -737,11 +726,11 @@ public abstract class StackValue {
if (resolvedSetCall.getReceiverArgument().exists()) { if (resolvedSetCall.getReceiverArgument().exists()) {
codegen.generateFromResolvedCall(resolvedSetCall.getThisObject(), OBJECT_TYPE); codegen.generateFromResolvedCall(resolvedSetCall.getThisObject(), OBJECT_TYPE);
} }
v.load(realReceiverIndex - realReceiverType.getSize(), realReceiverType); v.load(realReceiverIndex, realReceiverType);
} }
else { else {
if (resolvedSetCall.getReceiverArgument().exists()) { if (resolvedSetCall.getReceiverArgument().exists()) {
v.load(realReceiverIndex - realReceiverType.getSize(), realReceiverType); v.load(realReceiverIndex, realReceiverType);
} }
else { else {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
@@ -751,31 +740,27 @@ public abstract class StackValue {
int index = firstParamIndex; int index = firstParamIndex;
for (ValueParameterDescriptor valueParameter : valueParameters) { for (ValueParameterDescriptor valueParameter : valueParameters) {
Type type = codegen.typeMapper.mapType(valueParameter.getType()); Type type = codegen.typeMapper.mapType(valueParameter.getType());
int sz = type.getSize(); v.load(index, type);
v.load(index - sz, type); index -= type.getSize();
index -= sz;
} }
// restoring original // restoring original
if (thisIndex != -1) { if (thisIndex != -1) {
v.load(thisIndex - 1, OBJECT_TYPE); v.load(thisIndex, OBJECT_TYPE);
} }
if (receiverIndex != -1) { if (receiverIndex != -1) {
v.load(receiverIndex - realReceiverType.getSize(), realReceiverType); v.load(receiverIndex, realReceiverType);
} }
index = firstParamIndex; index = firstParamIndex;
for (ValueParameterDescriptor valueParameter : valueParameters) { for (ValueParameterDescriptor valueParameter : valueParameters) {
Type type = codegen.typeMapper.mapType(valueParameter.getType()); Type type = codegen.typeMapper.mapType(valueParameter.getType());
int sz = type.getSize(); v.load(index, type);
v.load(index - sz, type); index -= type.getSize();
index -= sz;
} }
for (int i = 0; i < size; i++) { mark.dropTo();
frame.leaveTemp(OBJECT_TYPE);
}
} }
private boolean isStandardStack(ResolvedCall<?> call, int valueParamsSize) { private boolean isStandardStack(ResolvedCall<?> call, int valueParamsSize) {