Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
3250b8cf
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,发现更多精彩内容 >>
提交
3250b8cf
编写于
4月 07, 2011
作者:
D
Dmitry Jemerov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
boxing for variables
上级
a053bda9
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
61 addition
and
7 deletion
+61
-7
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+2
-1
idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java
idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java
+21
-0
idea/src/org/jetbrains/jet/codegen/StackValue.java
idea/src/org/jetbrains/jet/codegen/StackValue.java
+31
-6
idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
+7
-0
未找到文件。
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
3250b8cf
...
...
@@ -275,7 +275,8 @@ public class ExpressionCodegen extends JetVisitor {
else
{
int
index
=
myMap
.
getIndex
(
descriptor
);
if
(
index
>=
0
)
{
myStack
.
push
(
StackValue
.
local
(
index
,
((
PropertyDescriptor
)
descriptor
).
getOutType
()));
final
JetType
outType
=
((
PropertyDescriptor
)
descriptor
).
getOutType
();
myStack
.
push
(
StackValue
.
local
(
index
,
typeMapper
.
mapType
(
outType
)));
}
else
{
throw
new
UnsupportedOperationException
(
"don't know how to generate reference "
+
descriptor
);
...
...
idea/src/org/jetbrains/jet/codegen/JetTypeMapper.java
浏览文件 @
3250b8cf
...
...
@@ -26,24 +26,45 @@ public class JetTypeMapper {
if
(
jetType
.
equals
(
standardLibrary
.
getLongType
()))
{
return
Type
.
LONG_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getLongType
())))
{
return
Type
.
getObjectType
(
"java/lang/Long"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getShortType
()))
{
return
Type
.
SHORT_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getShortType
())))
{
return
Type
.
getObjectType
(
"java/lang/Short"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getByteType
()))
{
return
Type
.
BYTE_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getByteType
())))
{
return
Type
.
getObjectType
(
"java/lang/Byte"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getCharType
()))
{
return
Type
.
CHAR_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getCharType
())))
{
return
Type
.
getObjectType
(
"java/lang/Char"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getFloatType
()))
{
return
Type
.
FLOAT_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getFloatType
())))
{
return
Type
.
getObjectType
(
"java/lang/Float"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getDoubleType
()))
{
return
Type
.
DOUBLE_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getDoubleType
())))
{
return
Type
.
getObjectType
(
"java/lang/Double"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getBooleanType
()))
{
return
Type
.
BOOLEAN_TYPE
;
}
if
(
jetType
.
equals
(
TypeUtils
.
makeNullable
(
standardLibrary
.
getBooleanType
())))
{
return
Type
.
getObjectType
(
"java/lang/Boolean"
);
}
if
(
jetType
.
equals
(
standardLibrary
.
getStringType
()))
{
return
Type
.
getType
(
String
.
class
);
}
...
...
idea/src/org/jetbrains/jet/codegen/StackValue.java
浏览文件 @
3250b8cf
package
org.jetbrains.jet.codegen
;
import
com.intellij.psi.tree.IElementType
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.jetbrains.jet.lexer.JetTokens
;
import
org.objectweb.asm.Label
;
import
org.objectweb.asm.Opcodes
;
...
...
@@ -14,7 +13,7 @@ import org.objectweb.asm.commons.InstructionAdapter;
public
abstract
class
StackValue
{
public
abstract
void
put
(
Type
type
,
InstructionAdapter
v
);
public
static
StackValue
local
(
int
index
,
Jet
Type
type
)
{
public
static
StackValue
local
(
int
index
,
Type
type
)
{
return
new
Local
(
index
,
type
);
}
...
...
@@ -35,17 +34,43 @@ public abstract class StackValue {
public
static
class
Local
extends
StackValue
{
private
final
int
index
;
private
final
Jet
Type
type
;
private
final
Type
type
;
public
Local
(
int
index
,
Jet
Type
type
)
{
public
Local
(
int
index
,
Type
type
)
{
this
.
index
=
index
;
this
.
type
=
type
;
}
@Override
public
void
put
(
Type
type
,
InstructionAdapter
v
)
{
v
.
load
(
index
,
type
);
// TODO box/unbox
v
.
load
(
index
,
this
.
type
);
if
(
type
.
getSort
()
==
Type
.
OBJECT
)
{
if
(
this
.
type
==
Type
.
INT_TYPE
)
{
v
.
invokestatic
(
"java/lang/Integer"
,
"valueOf"
,
"(I)Ljava/lang/Integer;"
);
}
else
if
(
this
.
type
==
Type
.
BOOLEAN_TYPE
)
{
v
.
invokestatic
(
"java/lang/Boolean"
,
"valueOf"
,
"(Z)Ljava/lang/Boolean;"
);
}
else
if
(
this
.
type
==
Type
.
CHAR_TYPE
)
{
v
.
invokestatic
(
"java/lang/Character"
,
"valueOf"
,
"(C)Ljava/lang/Character;"
);
}
else
if
(
this
.
type
==
Type
.
SHORT_TYPE
)
{
v
.
invokestatic
(
"java/lang/Short"
,
"valueOf"
,
"(S)Ljava/lang/Short;"
);
}
else
if
(
this
.
type
==
Type
.
LONG_TYPE
)
{
v
.
invokestatic
(
"java/lang/Long"
,
"valueOf"
,
"(J)Ljava/lang/Long;"
);
}
else
if
(
this
.
type
==
Type
.
BYTE_TYPE
)
{
v
.
invokestatic
(
"java/lang/Byte"
,
"valueOf"
,
"(B)Ljava/lang/Byte;"
);
}
else
if
(
this
.
type
==
Type
.
FLOAT_TYPE
)
{
v
.
invokestatic
(
"java/lang/Float"
,
"valueOf"
,
"(F)Ljava/lang/Float;"
);
}
else
if
(
this
.
type
==
Type
.
DOUBLE_TYPE
)
{
v
.
invokestatic
(
"java/lang/Double"
,
"valueOf"
,
"(D)Ljava/lang/Double;"
);
}
}
// TODO unbox
}
@Override
...
...
idea/tests/org/jetbrains/jet/codegen/NamespaceGenTest.java
浏览文件 @
3250b8cf
...
...
@@ -233,6 +233,13 @@ public class NamespaceGenTest extends LightCodeInsightFixtureTestCase {
assertEquals
(
239
,
main
.
invoke
(
null
));
}
public
void
testBoxVariable
()
throws
Exception
{
loadText
(
"fun foo(): Int? { var x = 239; return x; }"
);
System
.
out
.
println
(
generateToText
());
final
Method
main
=
generateFunction
();
assertEquals
(
239
,
main
.
invoke
(
null
));
}
public
void
testLong
()
throws
Exception
{
loadText
(
"fun foo(a: Long, b: Long): Long = a + b"
);
System
.
out
.
println
(
generateToText
());
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录