Fix initialization order in REPL

#KT-6843 Fixed
This commit is contained in:
Alexander Udalov
2015-02-22 16:12:38 +03:00
parent e47a156e36
commit cf0842b135
4 changed files with 44 additions and 14 deletions
@@ -123,7 +123,7 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
@NotNull ScriptDescriptor scriptDescriptor,
@NotNull ClassDescriptor classDescriptorForScript,
@NotNull ClassBuilder classBuilder,
@NotNull final MethodContext methodContext
@NotNull MethodContext methodContext
) {
//noinspection ConstantConditions
Type blockType = typeMapper.mapType(scriptDescriptor.getScriptCodeDescriptor().getReturnType());
@@ -143,7 +143,7 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode();
final InstructionAdapter iv = new InstructionAdapter(mv);
InstructionAdapter iv = new InstructionAdapter(mv);
Type classType = typeMapper.mapType(classDescriptorForScript);
@@ -152,7 +152,7 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
iv.load(0, classType);
final FrameMap frameMap = new FrameMap();
FrameMap frameMap = new FrameMap();
frameMap.enterTemp(OBJECT_TYPE);
for (ScriptDescriptor importedScript : context.getEarlierScripts()) {
@@ -167,13 +167,6 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
frameMap.enter(parameter, argTypes[i + add]);
}
generateInitializers(new Function0<ExpressionCodegen>() {
@Override
public ExpressionCodegen invoke() {
return new ExpressionCodegen(iv, frameMap, Type.VOID_TYPE, methodContext, state, ScriptCodegen.this);
}
});
int offset = 1;
for (ScriptDescriptor earlierScript : context.getEarlierScripts()) {
@@ -192,9 +185,16 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
iv.putfield(classType.getInternalName(), parameter.getName().getIdentifier(), parameterType.getDescriptor());
}
StackValue stackValue =
new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, methodContext, state, this)
.gen(scriptDeclaration.getBlockExpression());
final ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, methodContext, state, this);
generateInitializers(new Function0<ExpressionCodegen>() {
@Override
public ExpressionCodegen invoke() {
return codegen;
}
});
StackValue stackValue = codegen.gen(scriptDeclaration.getBlockExpression());
if (stackValue.type != Type.VOID_TYPE) {
StackValue.Field resultValue = StackValue
.field(blockType, classType, ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME, false, StackValue.LOCAL_0);
@@ -0,0 +1,5 @@
>>> [data] class Person(val name: String)
>>> var x: String? = "hello"
>>> val y = x?.let { Person(it) }
>>> y
Person(name=hello)
@@ -0,0 +1,4 @@
>>> val x = ""
>>> val y = x
>>> x == y
true
@@ -30,7 +30,7 @@ import java.util.regex.Pattern;
@SuppressWarnings("all")
@TestMetadata("compiler/testData/repl")
@TestDataPath("$PROJECT_ROOT")
@InnerTestClasses({ReplInterpreterTestGenerated.Classes.class, ReplInterpreterTestGenerated.Multiline.class, ReplInterpreterTestGenerated.Objects.class, ReplInterpreterTestGenerated.PrimitiveTypes.class, ReplInterpreterTestGenerated.Reflection.class})
@InnerTestClasses({ReplInterpreterTestGenerated.Classes.class, ReplInterpreterTestGenerated.Multiline.class, ReplInterpreterTestGenerated.Objects.class, ReplInterpreterTestGenerated.PrimitiveTypes.class, ReplInterpreterTestGenerated.Reflection.class, ReplInterpreterTestGenerated.Regressions.class})
@RunWith(JUnit3RunnerWithInners.class)
public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest {
public void testAllFilesPresentInRepl() throws Exception {
@@ -97,6 +97,12 @@ public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest {
doTest(fileName);
}
@TestMetadata("simpleTwoVals.repl")
public void testSimpleTwoVals() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/repl/simpleTwoVals.repl");
doTest(fileName);
}
@TestMetadata("syntaxErrors.repl")
public void testSyntaxErrors() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/repl/syntaxErrors.repl");
@@ -267,4 +273,19 @@ public class ReplInterpreterTestGenerated extends AbstractReplInterpreterTest {
doTest(fileName);
}
}
@TestMetadata("compiler/testData/repl/regressions")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class Regressions extends AbstractReplInterpreterTest {
public void testAllFilesPresentInRegressions() throws Exception {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/repl/regressions"), Pattern.compile("^(.+)\\.repl$"), true);
}
@TestMetadata("kt6843.repl")
public void testKt6843() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/repl/regressions/kt6843.repl");
doTest(fileName);
}
}
}