Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
5b5e8119
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,发现更多精彩内容 >>
提交
5b5e8119
编写于
4月 07, 2011
作者:
D
Dmitry Jemerov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Float
上级
b6a078a5
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
53 addition
and
24 deletion
+53
-24
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+19
-14
idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java
idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java
+3
-0
idea/src/org/jetbrains/jet/codegen/StackValue.java
idea/src/org/jetbrains/jet/codegen/StackValue.java
+23
-10
idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
+8
-0
未找到文件。
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
5b5e8119
...
...
@@ -468,13 +468,14 @@ public class ExpressionCodegen extends JetVisitor {
}
DeclarationDescriptor
op
=
bindingContext
.
resolveReferenceExpression
(
expression
.
getOperationReference
());
if
(
op
instanceof
FunctionDescriptor
)
{
JetType
returnType
=
bindingContext
.
getExpressionType
(
expression
);
final
Type
asmType
=
typeMapper
.
mapType
(
returnType
);
DeclarationDescriptor
cls
=
op
.
getContainingDeclaration
();
if
(
cls
instanceof
ClassDescriptor
)
{
final
String
className
=
cls
.
getName
();
if
(
className
.
equals
(
"Int"
)
||
className
.
equals
(
"Long"
)
||
className
.
equals
(
"Short"
)
||
className
.
equals
(
"Byte"
)
||
className
.
equals
(
"Char"
))
{
if
(
isNumberPrimitive
(
className
))
{
if
(
op
.
getName
().
equals
(
"compareTo"
))
{
generateCompareOp
(
expression
,
opToken
);
generateCompareOp
(
expression
,
opToken
,
asmType
);
}
else
{
int
opcode
=
opcodeForMethod
(
op
.
getName
());
...
...
@@ -486,10 +487,8 @@ public class ExpressionCodegen extends JetVisitor {
if
(
op
.
getName
().
equals
(
"equals"
))
{
final
Type
leftType
=
typeMapper
.
mapType
(
bindingContext
.
getExpressionType
(
expression
.
getLeft
()));
final
Type
rightType
=
typeMapper
.
mapType
(
bindingContext
.
getExpressionType
(
expression
.
getRight
()));
if
(
isIntLikePrimitive
(
leftType
)
&&
isIntLikePrimitive
(
rightType
))
{
gen
(
expression
.
getLeft
(),
Type
.
INT_TYPE
);
gen
(
expression
.
getRight
(),
Type
.
INT_TYPE
);
myStack
.
push
(
StackValue
.
icmp
(
opToken
));
if
(
isNumberPrimitive
(
leftType
)
&&
leftType
==
rightType
)
{
generateCompareOp
(
expression
,
opToken
,
leftType
);
return
;
}
else
{
...
...
@@ -505,8 +504,14 @@ public class ExpressionCodegen extends JetVisitor {
throw
new
UnsupportedOperationException
(
"Don't know how to generate binary op "
+
expression
);
}
private
static
boolean
isIntLikePrimitive
(
Type
type
)
{
return
type
==
Type
.
INT_TYPE
||
type
==
Type
.
SHORT_TYPE
||
type
==
Type
.
BYTE_TYPE
||
type
==
Type
.
CHAR_TYPE
;
private
static
boolean
isNumberPrimitive
(
String
className
)
{
return
className
.
equals
(
"Int"
)
||
className
.
equals
(
"Long"
)
||
className
.
equals
(
"Short"
)
||
className
.
equals
(
"Byte"
)
||
className
.
equals
(
"Char"
)
||
className
.
equals
(
"Float"
);
}
private
static
boolean
isNumberPrimitive
(
Type
type
)
{
return
type
==
Type
.
INT_TYPE
||
type
==
Type
.
SHORT_TYPE
||
type
==
Type
.
BYTE_TYPE
||
type
==
Type
.
CHAR_TYPE
||
type
==
Type
.
FLOAT_TYPE
;
}
private
static
int
opcodeForMethod
(
final
String
name
)
{
...
...
@@ -521,7 +526,7 @@ public class ExpressionCodegen extends JetVisitor {
private
void
generateBinaryOp
(
JetBinaryExpression
expression
,
FunctionDescriptor
op
,
int
opcode
)
{
JetType
returnType
=
op
.
getUnsubstitutedReturnType
();
final
Type
asmType
=
typeMapper
.
mapType
(
returnType
);
if
(
asmType
==
Type
.
INT_TYPE
||
asmType
==
Type
.
LONG_TYPE
)
{
if
(
asmType
==
Type
.
INT_TYPE
||
asmType
==
Type
.
LONG_TYPE
||
asmType
==
Type
.
FLOAT_TYPE
)
{
gen
(
expression
.
getLeft
(),
asmType
);
gen
(
expression
.
getRight
(),
asmType
);
v
.
visitInsn
(
asmType
.
getOpcode
(
opcode
));
...
...
@@ -532,10 +537,10 @@ public class ExpressionCodegen extends JetVisitor {
}
}
private
void
generateCompareOp
(
JetBinaryExpression
expression
,
IElementType
opToken
)
{
gen
(
expression
.
getLeft
(),
Type
.
INT_TYPE
);
gen
(
expression
.
getRight
(),
Type
.
INT_TYPE
);
myStack
.
push
(
StackValue
.
icmp
(
opToken
));
private
void
generateCompareOp
(
JetBinaryExpression
expression
,
IElementType
opToken
,
Type
type
)
{
gen
(
expression
.
getLeft
(),
type
);
gen
(
expression
.
getRight
(),
type
);
myStack
.
push
(
StackValue
.
cmp
(
opToken
,
type
));
}
private
void
generateAssignmentExpression
(
JetBinaryExpression
expression
)
{
...
...
idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java
浏览文件 @
5b5e8119
...
...
@@ -32,6 +32,9 @@ public class JetTypeMapper {
if
(
jetType
.
equals
(
standardLibrary
.
getCharType
()))
{
return
Type
.
CHAR_TYPE
;
}
if
(
jetType
.
equals
(
standardLibrary
.
getFloatType
()))
{
return
Type
.
FLOAT_TYPE
;
}
if
(
jetType
.
equals
(
standardLibrary
.
getBooleanType
()))
{
return
Type
.
BOOLEAN_TYPE
;
}
...
...
idea/src/org/jetbrains/jet/codegen/StackValue.java
浏览文件 @
5b5e8119
...
...
@@ -27,8 +27,8 @@ public abstract class StackValue {
return
new
Constant
(
value
);
}
public
static
StackValue
icmp
(
IElementType
opToken
)
{
return
new
IntCompare
(
opToken
);
public
static
StackValue
cmp
(
IElementType
opToken
,
Type
type
)
{
return
new
NumberCompare
(
opToken
,
type
);
}
public
abstract
void
condJump
(
Label
label
,
boolean
jumpIfFalse
,
InstructionAdapter
v
);
...
...
@@ -113,11 +113,13 @@ public abstract class StackValue {
}
}
private
static
class
Int
Compare
extends
StackValue
{
private
static
class
Number
Compare
extends
StackValue
{
private
final
IElementType
opToken
;
private
final
Type
type
;
public
IntCompare
(
IElementType
opToken
)
{
public
NumberCompare
(
IElementType
opToken
,
Type
type
)
{
this
.
opToken
=
opToken
;
this
.
type
=
type
;
}
@Override
...
...
@@ -136,26 +138,37 @@ public abstract class StackValue {
public
void
condJump
(
Label
label
,
boolean
jumpIfFalse
,
InstructionAdapter
v
)
{
int
opcode
;
if
(
opToken
==
JetTokens
.
EQEQ
)
{
opcode
=
jumpIfFalse
?
Opcodes
.
IF
_ICMPNE
:
Opcodes
.
IF_ICMP
EQ
;
opcode
=
jumpIfFalse
?
Opcodes
.
IF
NE
:
Opcodes
.
IF
EQ
;
}
else
if
(
opToken
==
JetTokens
.
EXCLEQ
)
{
opcode
=
jumpIfFalse
?
Opcodes
.
IF
_ICMPEQ
:
Opcodes
.
IF_ICMP
NE
;
opcode
=
jumpIfFalse
?
Opcodes
.
IF
EQ
:
Opcodes
.
IF
NE
;
}
else
if
(
opToken
==
JetTokens
.
GT
)
{
opcode
=
jumpIfFalse
?
Opcodes
.
IF
_ICMPLE
:
Opcodes
.
IF_ICMP
GT
;
opcode
=
jumpIfFalse
?
Opcodes
.
IF
LE
:
Opcodes
.
IF
GT
;
}
else
if
(
opToken
==
JetTokens
.
GTEQ
)
{
opcode
=
jumpIfFalse
?
Opcodes
.
IF
_ICMPLT
:
Opcodes
.
IF_ICMP
GE
;
opcode
=
jumpIfFalse
?
Opcodes
.
IF
LT
:
Opcodes
.
IF
GE
;
}
else
if
(
opToken
==
JetTokens
.
LT
)
{
opcode
=
jumpIfFalse
?
Opcodes
.
IF
_ICMPGE
:
Opcodes
.
IF_ICMP
LT
;
opcode
=
jumpIfFalse
?
Opcodes
.
IF
GE
:
Opcodes
.
IF
LT
;
}
else
if
(
opToken
==
JetTokens
.
LTEQ
)
{
opcode
=
jumpIfFalse
?
Opcodes
.
IF
_ICMPGT
:
Opcodes
.
IF_ICMP
LE
;
opcode
=
jumpIfFalse
?
Opcodes
.
IF
GT
:
Opcodes
.
IF
LE
;
}
else
{
throw
new
UnsupportedOperationException
(
"don't know how to generate this condjump"
);
}
if
(
type
==
Type
.
FLOAT_TYPE
)
{
if
(
opToken
==
JetTokens
.
GT
||
opToken
==
JetTokens
.
GTEQ
)
{
v
.
cmpg
(
type
);
}
else
{
v
.
cmpl
(
type
);
}
}
else
{
opcode
+=
(
Opcodes
.
IF_ICMPEQ
-
Opcodes
.
IFEQ
);
}
v
.
visitJumpInsn
(
opcode
,
label
);
}
}
...
...
idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
浏览文件 @
5b5e8119
...
...
@@ -279,6 +279,14 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
binOpTest
(
"fun foo(a: Char, b: Char): Int = a + b"
,
'A'
,
(
char
)
3
,
(
int
)
'D'
);
}
public
void
testFloat
()
throws
Exception
{
binOpTest
(
"fun foo(a: Float, b: Float): Float = a + b"
,
1.0f
,
2.0f
,
3.0f
);
}
public
void
testFloatCmp
()
throws
Exception
{
binOpTest
(
"fun foo(a: Float, b: Float): Boolean = a == b"
,
1.0f
,
1.0f
,
true
);
}
private
void
binOpTest
(
final
String
text
,
final
Object
arg1
,
final
Object
arg2
,
final
Object
expected
)
throws
Exception
{
loadText
(
text
);
System
.
out
.
println
(
generateToText
());
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录