Remove intrinsics from CollectionElement

This commit is contained in:
Michael Bogdanov
2015-04-03 15:58:04 +03:00
parent 44582f76e3
commit b2fe44997a
@@ -860,8 +860,8 @@ public abstract class StackValue {
} }
public static class CollectionElement extends StackValueWithSimpleReceiver { public static class CollectionElement extends StackValueWithSimpleReceiver {
private final Callable getter; private final ExtendedCallable getter;
private final Callable setter; private final ExtendedCallable setter;
private final ExpressionCodegen codegen; private final ExpressionCodegen codegen;
private final GenerationState state; private final GenerationState state;
private final ResolvedCall<FunctionDescriptor> resolvedGetCall; private final ResolvedCall<FunctionDescriptor> resolvedGetCall;
@@ -883,8 +883,10 @@ public abstract class StackValue {
this.state = state; this.state = state;
this.setterDescriptor = resolvedSetCall == null ? null : resolvedSetCall.getResultingDescriptor(); this.setterDescriptor = resolvedSetCall == null ? null : resolvedSetCall.getResultingDescriptor();
this.getterDescriptor = resolvedGetCall == null ? null : resolvedGetCall.getResultingDescriptor(); this.getterDescriptor = resolvedGetCall == null ? null : resolvedGetCall.getResultingDescriptor();
this.setter = resolvedSetCall == null ? null : codegen.resolveToCallable(setterDescriptor, false, resolvedSetCall); this.setter =
this.getter = resolvedGetCall == null ? null : codegen.resolveToCallable(getterDescriptor, false, resolvedGetCall); resolvedSetCall == null ? null : (ExtendedCallable) codegen.resolveToCallable(setterDescriptor, false, resolvedSetCall);
this.getter =
resolvedGetCall == null ? null : (ExtendedCallable) codegen.resolveToCallable(getterDescriptor, false, resolvedGetCall);
this.codegen = codegen; this.codegen = codegen;
} }
@@ -893,13 +895,8 @@ public abstract class StackValue {
if (getter == null) { if (getter == null) {
throw new UnsupportedOperationException("no getter specified"); throw new UnsupportedOperationException("no getter specified");
} }
if (getter instanceof ExtendedCallable) {
((ExtendedCallable) getter).invokeWithNotNullAssertion(v, state, resolvedGetCall); getter.invokeWithNotNullAssertion(v, state, resolvedGetCall);
}
else {
StackValue result = ((IntrinsicMethod) getter).generate(codegen, this.type, null, Collections.<JetExpression>emptyList(), StackValue.none());
result.put(result.type, v);
}
coerceTo(type, v); coerceTo(type, v);
} }
@@ -949,20 +946,13 @@ public abstract class StackValue {
if (setter == null) { if (setter == null) {
throw new UnsupportedOperationException("no setter specified"); throw new UnsupportedOperationException("no setter specified");
} }
if (setter instanceof ExtendedCallable) {
ExtendedCallable method = (ExtendedCallable) setter; Type[] argumentTypes = setter.getArgumentTypes();
Type[] argumentTypes = method.getArgumentTypes(); coerce(topOfStackType, argumentTypes[argumentTypes.length - 1], v);
coerce(topOfStackType, argumentTypes[argumentTypes.length - 1], v); setter.invokeWithNotNullAssertion(v, state, resolvedSetCall);
method.invokeWithNotNullAssertion(v, state, resolvedSetCall); Type returnType = setter.getReturnType();
Type returnType = method.getReturnType(); if (returnType != Type.VOID_TYPE) {
if (returnType != Type.VOID_TYPE) { pop(v, returnType);
pop(v, returnType);
}
}
else {
//noinspection ConstantConditions
StackValue result = ((IntrinsicMethod) setter).generate(codegen, null, null, Collections.<JetExpression>emptyList(), StackValue.none());
result.put(result.type, v);
} }
} }
} }