diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index c38fa4541cf..9fdb7b1f309 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -224,7 +224,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen { int i = 0; if (captureThis) { - argTypes[i++] = Type.getObjectType(context.getThisDescriptor().getName()); + argTypes[i++] = state.getTypeMapper().mapType(context.getThisDescriptor().getDefaultType()); } if (captureReceiver != null) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 1167da9c208..e69555a882b 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -608,17 +608,20 @@ public class ExpressionCodegen extends JetVisitor { final Method cons = closure.getConstructor(); + int k = 0; if (closure.isCaptureThis()) { + k++; v.load(0, JetTypeMapper.TYPE_OBJECT); } if (closure.isCaptureReceiver() != null) { + k++; v.load(context.getContextDescriptor().getContainingDeclaration() instanceof NamespaceDescriptor ? 0: 1, closure.isCaptureReceiver()); } for (int i = 0; i < closure.getArgs().size(); i++) { StackValue arg = closure.getArgs().get(i); - arg.put(cons.getArgumentTypes()[i], v); + arg.put(cons.getArgumentTypes()[i+k], v); } v.invokespecial(closure.getClassname(), "", cons.getDescriptor()); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 16a4a1b2430..9e5dbb5637f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -173,6 +173,11 @@ public class JetTypeMapper { public String getFQName(DeclarationDescriptor descriptor) { descriptor = descriptor.getOriginal(); + + if(descriptor instanceof FunctionDescriptor) { + return getFQName(descriptor.getContainingDeclaration()); + } + DeclarationDescriptor container = descriptor.getContainingDeclaration(); String name = descriptor.getName(); if(JetPsiUtil.NO_NAME_PROVIDED.equals(name)) { diff --git a/compiler/testData/codegen/regressions/kt529.kt b/compiler/testData/codegen/regressions/kt529.kt new file mode 100644 index 00000000000..66487f37509 --- /dev/null +++ b/compiler/testData/codegen/regressions/kt529.kt @@ -0,0 +1,98 @@ +namespace mask + +import std.io.* +import java.io.* +import java.util.* + +fun box() : String { + val input = StringReader("/Users/abreslav/work/jet/docs/luhnybin/src/test") + + val luhny = Luhny() + input.forEachChar { + luhny.process(it) + } + luhny.printAll() + return "OK" +} + +class Luhny() { + private val buffer = ArrayDeque() + private val digits = ArrayDeque(16) + + private var toBeMasked = 0 + + fun process(it : Char) { + buffer.addLast(it) + when (it) { + .isDigit() => digits.addLast(it.int - '0'.int) + ' ', '-' => {} + else => printAll() + } + if (digits.size() > 16) + printOneDigit() + check() + } + + private fun check() { + val size = digits.size() + if (size < 14) return + val sum = digits.sum {i, d => + if (i % 2 == size % 2) double(d) else d + } +// var sum = 0 +// var i = 0 +// for (d in digits) { +// sum += if (i % 2 == size % 2) double(d) else d +// i++ +// } + if (sum % 10 == 0) toBeMasked = digits.size() + } + + private fun double(d : Int) = d * 2 / 10 + d * 2 % 10 + + private fun printOneDigit() { + while (!buffer.isEmpty()) { + val c = buffer.removeFirst() + print(c) + if (c.isDigit()) { + digits.removeFirst() + return + } + } + } + + private fun printAll() { + while (!buffer.isEmpty()) + print(buffer.removeFirst()) + digits.clear() + } + + private fun print(c : Char) { + if (c.isDigit() && toBeMasked > 0) { + std.io.print('X') + toBeMasked-- + } else { + std.io.print(c) + } + } +} + +fun Char.isDigit() = Character.isDigit(this) + +fun java.lang.Iterable.sum(f : fun(index : Int, value : Int) : Int) : Int { + var sum = 0 + var i = 0 + for (d in this) { + sum += f(i, d) + i++ + } + return sum +} + +fun Reader.forEachChar(body : fun(Char) : Unit) { + do { + var i = read(); + if (i == -1) break + body(i.chr) + } while(true) +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java index d0a46de0a7c..86a7f1d1e31 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/StdlibTest.java @@ -77,4 +77,8 @@ public class StdlibTest extends CodegenTestCase { public void testKt533 () { blackBoxFile("regressions/kt533.kt"); } + + public void testKt529 () { + blackBoxFile("regressions/kt529.kt"); + } } diff --git a/stdlib/ktSrc/StandardLibrary.kt b/stdlib/ktSrc/StandardLibrary.kt index 999cecbad2c..53d594e313a 100644 --- a/stdlib/ktSrc/StandardLibrary.kt +++ b/stdlib/ktSrc/StandardLibrary.kt @@ -1,5 +1,15 @@ namespace std +namespace util { + import java.util.* + + val Collection.size : Int + get() = size() + + val Collection.empty : Boolean + get() = isEmpty() +} + namespace io { import java.io.* import java.nio.charset.*