Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
686d4cae
K
kotlin
项目概览
硅谷海盗
/
kotlin
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kotlin
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
686d4cae
编写于
1月 27, 2012
作者:
A
Alex Tkachman
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
postfix part of KT-471
上级
8d39594b
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
211 addition
and
17 deletion
+211
-17
compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
...kend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+78
-17
compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
...ler/backend/src/org/jetbrains/jet/codegen/StackValue.java
+32
-0
compiler/testData/codegen/regressions/kt471.kt
compiler/testData/codegen/regressions/kt471.kt
+97
-0
compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java
compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java
+4
-0
未找到文件。
compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
686d4cae
...
...
@@ -2006,19 +2006,36 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
Arrays
.
asList
(
expression
.
getBaseExpression
()),
receiver
);
}
else
{
return
invokeOperation
(
expression
,
(
FunctionDescriptor
)
op
,
(
CallableMethod
)
callable
);
DeclarationDescriptor
cls
=
op
.
getContainingDeclaration
();
if
(
isNumberPrimitive
(
cls
)
||
!(
op
.
getName
().
equals
(
"inc"
)
||
op
.
getName
().
equals
(
"dec"
))
)
{
return
invokeOperation
(
expression
,
(
FunctionDescriptor
)
op
,
(
CallableMethod
)
callable
);
}
else
{
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
=
bindingContext
.
get
(
BindingContext
.
RESOLVED_CALL
,
expression
.
getOperationReference
());
assert
resolvedCall
!=
null
;
StackValue
value
=
gen
(
expression
.
getBaseExpression
());
value
.
dupReceiver
(
v
);
value
.
dupReceiver
(
v
);
Type
type
=
expressionType
(
expression
.
getBaseExpression
());
value
.
put
(
type
,
v
);
((
CallableMethod
)
callable
).
invoke
(
v
);
value
.
store
(
v
);
value
.
put
(
type
,
v
);
return
StackValue
.
onStack
(
type
);
}
}
}
private
StackValue
invokeOperation
(
JetOperationExpression
expression
,
FunctionDescriptor
op
,
CallableMethod
callable
)
{
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
=
bindingContext
.
get
(
BindingContext
.
RESOLVED_CALL
,
expression
.
getOperationReference
());
assert
resolvedCall
!=
null
;
CallableMethod
callableMethod
=
(
CallableMethod
)
callable
;
genThisAndReceiverFromResolvedCall
(
StackValue
.
none
(),
resolvedCall
,
callableMethod
);
genThisAndReceiverFromResolvedCall
(
StackValue
.
none
(),
resolvedCall
,
callable
);
pushTypeArguments
(
resolvedCall
);
pushMethodArguments
(
resolvedCall
,
callable
Method
.
getValueParameterTypes
());
callable
Method
.
invoke
(
v
);
return
returnValueAsStackValue
(
(
FunctionDescriptor
)
op
,
callableMethod
.
getSignature
().
getAsmMethod
().
getReturnType
());
pushMethodArguments
(
resolvedCall
,
callable
.
getValueParameterTypes
());
callable
.
invoke
(
v
);
return
returnValueAsStackValue
(
op
,
callable
.
getSignature
().
getAsmMethod
().
getReturnType
());
}
@Override
...
...
@@ -2027,19 +2044,63 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
if
(
op
instanceof
FunctionDescriptor
)
{
final
Type
asmType
=
expressionType
(
expression
);
DeclarationDescriptor
cls
=
op
.
getContainingDeclaration
();
if
(
isNumberPrimitive
(
cls
)
&&
(
op
.
getName
().
equals
(
"inc"
)
||
op
.
getName
().
equals
(
"dec"
)))
{
receiver
.
put
(
receiver
.
type
,
v
);
JetExpression
operand
=
expression
.
getBaseExpression
();
if
(
operand
instanceof
JetReferenceExpression
)
{
final
int
index
=
indexOfLocal
((
JetReferenceExpression
)
operand
);
if
(
index
>=
0
&&
isIntPrimitive
(
asmType
))
{
int
increment
=
op
.
getName
().
equals
(
"inc"
)
?
1
:
-
1
;
return
StackValue
.
postIncrement
(
index
,
increment
);
if
(
op
.
getName
().
equals
(
"inc"
)
||
op
.
getName
().
equals
(
"dec"
))
{
if
(
isNumberPrimitive
(
cls
))
{
receiver
.
put
(
receiver
.
type
,
v
);
JetExpression
operand
=
expression
.
getBaseExpression
();
if
(
operand
instanceof
JetReferenceExpression
)
{
final
int
index
=
indexOfLocal
((
JetReferenceExpression
)
operand
);
if
(
index
>=
0
&&
isIntPrimitive
(
asmType
))
{
int
increment
=
op
.
getName
().
equals
(
"inc"
)
?
1
:
-
1
;
return
StackValue
.
postIncrement
(
index
,
increment
);
}
}
gen
(
operand
,
asmType
);
// old value
generateIncrement
(
op
,
asmType
,
operand
,
receiver
);
// increment in-place
return
StackValue
.
onStack
(
asmType
);
// old value
}
else
{
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
=
bindingContext
.
get
(
BindingContext
.
RESOLVED_CALL
,
expression
.
getOperationReference
());
assert
resolvedCall
!=
null
;
final
Callable
callable
=
resolveToCallable
(
op
,
false
);
StackValue
value
=
gen
(
expression
.
getBaseExpression
());
value
.
dupReceiver
(
v
);
Type
type
=
expressionType
(
expression
.
getBaseExpression
());
value
.
put
(
type
,
v
);
switch
(
value
.
receiverSize
())
{
case
0
:
if
(
type
.
getSize
()
==
2
)
v
.
dup2
();
else
v
.
dup
();
break
;
case
1
:
if
(
type
.
getSize
()
==
2
)
v
.
dup2X1
();
else
v
.
dupX1
();
break
;
case
2
:
if
(
type
.
getSize
()
==
2
)
v
.
dup2X2
();
else
v
.
dupX2
();
break
;
case
-
1
:
throw
new
UnsupportedOperationException
();
}
((
CallableMethod
)
callable
).
invoke
(
v
);
value
.
store
(
v
);
return
StackValue
.
onStack
(
type
);
}
gen
(
operand
,
asmType
);
// old value
generateIncrement
(
op
,
asmType
,
operand
,
receiver
);
// increment in-place
return
StackValue
.
onStack
(
asmType
);
// old value
}
}
throw
new
UnsupportedOperationException
(
"Don't know how to generate this prefix expression"
);
...
...
compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
浏览文件 @
686d4cae
...
...
@@ -51,6 +51,10 @@ public abstract class StackValue {
public
void
dupReceiver
(
InstructionAdapter
v
)
{
}
public
int
receiverSize
()
{
return
0
;
}
public
void
condJump
(
Label
label
,
boolean
jumpIfFalse
,
InstructionAdapter
v
)
{
if
(
this
.
type
==
Type
.
BOOLEAN_TYPE
)
{
put
(
Type
.
BOOLEAN_TYPE
,
v
);
...
...
@@ -491,6 +495,10 @@ public abstract class StackValue {
public
void
dupReceiver
(
InstructionAdapter
v
)
{
v
.
dup2
();
// array and index
}
public
int
receiverSize
()
{
return
2
;
}
}
private
static
class
CollectionElement
extends
StackValue
{
...
...
@@ -547,6 +555,15 @@ public abstract class StackValue {
((
IntrinsicMethod
)
setter
).
generate
(
codegen
,
v
,
null
,
null
,
null
,
null
);
}
public
int
receiverSize
()
{
if
(
isStandardStack
(
resolvedGetCall
)
&&
isStandardStack
(
resolvedSetCall
))
{
return
2
;
}
else
{
return
-
1
;
}
}
@Override
public
void
dupReceiver
(
InstructionAdapter
v
)
{
if
(
isStandardStack
(
resolvedGetCall
)
&&
isStandardStack
(
resolvedSetCall
))
{
...
...
@@ -686,6 +703,9 @@ public abstract class StackValue {
}
private
boolean
isStandardStack
(
ResolvedCall
call
)
{
if
(
call
==
null
)
return
true
;
for
(
TypeParameterDescriptor
typeParameterDescriptor
:
call
.
getResultingDescriptor
().
getTypeParameters
())
{
if
(
typeParameterDescriptor
.
isReified
())
return
false
;
...
...
@@ -736,6 +756,10 @@ public abstract class StackValue {
}
}
public
int
receiverSize
()
{
return
isStatic
?
0
:
1
;
}
@Override
public
void
store
(
InstructionAdapter
v
)
{
v
.
visitFieldInsn
(
isStatic
?
Opcodes
.
PUTSTATIC
:
Opcodes
.
PUTFIELD
,
owner
,
name
,
this
.
type
.
getDescriptor
());
...
...
@@ -801,6 +825,10 @@ public abstract class StackValue {
v
.
dup
();
}
}
public
int
receiverSize
()
{
return
isStatic
?
0
:
1
;
}
}
private
static
class
Expression
extends
StackValue
{
...
...
@@ -904,6 +932,10 @@ public abstract class StackValue {
v
.
dup
();
}
public
int
receiverSize
()
{
return
1
;
}
@Override
public
void
put
(
Type
type
,
InstructionAdapter
v
)
{
Type
sharedType
=
sharedTypeForType
(
this
.
type
);
...
...
compiler/testData/codegen/regressions/kt471.kt
0 → 100644
浏览文件 @
686d4cae
import
java.util.ArrayList
class
MyNumber
(
val
i
:
Int
)
{
fun
inc
():
MyNumber
=
MyNumber
(
i
+
1
)
}
class
MNR
(
var
ref
:
MyNumber
)
{}
fun
test1
()
:
Boolean
{
var
m
=
MyNumber
(
42
)
m
++
if
(
m
.
i
!=
43
)
return
false
return
true
}
fun
test2
()
:
Boolean
{
var
m
=
MyNumber
(
44
)
var
m2
=
m
++
if
(
m2
.
i
!=
44
)
return
false
if
(
m
.
i
!=
45
)
return
false
return
true
}
fun
test3
()
:
Boolean
{
var
mnr
=
MNR
(
MyNumber
(
42
))
mnr
.
ref
++
if
(
mnr
.
ref
.
i
!=
43
)
return
false
return
true
}
fun
test4
()
:
Boolean
{
var
mnr
=
MNR
(
MyNumber
(
42
))
val
m3
=
mnr
.
ref
++
if
(
m3
.
i
!=
42
)
return
false
return
true
}
fun
test5
()
:
Boolean
{
var
mnr
=
Array
<
MyNumber
>(
2
,{
MyNumber
(
42
)})
mnr
[
0
]++
if
(
mnr
[
0
].
i
!=
43
)
return
false
return
true
}
fun
test6
()
:
Boolean
{
var
mnr
=
Array
<
MyNumber
>(
2
,{
it
->
MyNumber
(
42
-
it
)})
mnr
[
1
]
=
mnr
[
0
]++
if
(
mnr
[
0
].
i
!=
43
)
return
false
if
(
mnr
[
1
].
i
!=
42
)
return
false
return
true
}
/*
fun test7() : Boolean {
var mnr = ArrayList<MyNumber>()
mnr.add(MyNumber(42))
mnr[0]++
if (mnr[0].i != 43) return false
return true
}
fun test8() : Boolean {
var mnr = ArrayList<MyNumber>()
mnr.add(MyNumber(42))
mnr.add(MyNumber(41))
mnr[1] = mnr[0]++
if (mnr[0].i != 43) return false
if (mnr[1].i != 42) return false
return true
}
*/
fun
box
()
:
String
{
var
m
=
MyNumber
(
42
)
if
(!
test1
())
return
"fail test 1"
if
(!
test2
())
return
"fail test 2"
if
(!
test3
())
return
"fail test 3"
if
(!
test4
())
return
"fail test 4"
if
(!
test5
())
return
"fail test 5"
if
(!
test6
())
return
"fail test 6"
/*
if (!test7()) return "fail test 7"
if (!test8()) return "fail test 8"
++m
if (m.i != 44) return "fail 0"
var m1 = ++m
if (m1.i != 46) return "fail 3"
if (m.i != 46) return "fail 4"
*/
return
"OK"
}
compiler/tests/org/jetbrains/jet/codegen/ClassGenTest.java
浏览文件 @
686d4cae
...
...
@@ -261,4 +261,8 @@ public class ClassGenTest extends CodegenTestCase {
public
void
testkt1157
()
throws
Exception
{
blackBoxFile
(
"regressions/kt1157.kt"
);
}
public
void
testkt471
()
throws
Exception
{
blackBoxFile
(
"regressions/kt471.kt"
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录