Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
2c7500c6
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,发现更多精彩内容 >>
提交
2c7500c6
编写于
4月 21, 2011
作者:
D
Dmitry Jemerov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
generate initializers for namespace properties in <clinit> method
上级
85f46abc
变更
4
显示空白变更内容
内联
并排
Showing
4 changed file
with
76 addition
and
15 deletion
+76
-15
idea/src/org/jetbrains/jet/codegen/ClassCodegen.java
idea/src/org/jetbrains/jet/codegen/ClassCodegen.java
+1
-2
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+20
-13
idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
+48
-0
idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
+7
-0
未找到文件。
idea/src/org/jetbrains/jet/codegen/ClassCodegen.java
浏览文件 @
2c7500c6
...
...
@@ -191,8 +191,7 @@ public class ClassCodegen {
if
(
initializer
!=
null
)
{
iv
.
load
(
0
,
JetTypeMapper
.
TYPE_OBJECT
);
codegen
.
genToJVMStack
(
initializer
);
iv
.
putfield
(
JetTypeMapper
.
getOwner
(
propertyDescriptor
),
propertyDescriptor
.
getName
(),
typeMapper
.
mapType
(
propertyDescriptor
.
getOutType
()).
getDescriptor
());
codegen
.
intermediateValueForProperty
(
propertyDescriptor
,
false
).
store
(
iv
);
}
}
...
...
idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
2c7500c6
...
...
@@ -371,11 +371,26 @@ public class ExpressionCodegen extends JetVisitor {
else
if
(
descriptor
instanceof
PropertyDescriptor
)
{
final
PropertyDescriptor
propertyDescriptor
=
(
PropertyDescriptor
)
descriptor
;
boolean
isStatic
=
descriptor
.
getContainingDeclaration
()
instanceof
NamespaceDescriptor
;
String
owner
=
JetTypeMapper
.
getOwner
(
descriptor
);
final
JetType
outType
=
((
VariableDescriptor
)
descriptor
).
getOutType
();
final
boolean
directToField
=
expression
.
getReferencedNameElementType
()
==
JetTokens
.
FIELD_IDENTIFIER
;
final
StackValue
iValue
=
intermediateValueForProperty
(
propertyDescriptor
,
directToField
);
if
(!
isStatic
)
{
ensureReceiverOnStack
(
expression
);
}
myStack
.
push
(
iValue
);
}
else
{
throw
new
UnsupportedOperationException
(
"don't know how to generate reference "
+
descriptor
);
}
}
}
public
StackValue
intermediateValueForProperty
(
PropertyDescriptor
propertyDescriptor
,
final
boolean
directToField
)
{
boolean
isStatic
=
propertyDescriptor
.
getContainingDeclaration
()
instanceof
NamespaceDescriptor
;
String
owner
=
JetTypeMapper
.
getOwner
(
propertyDescriptor
);
final
JetType
outType
=
propertyDescriptor
.
getOutType
();
Method
getter
;
Method
setter
;
if
(
expression
.
getReferencedNameElementType
()
==
JetTokens
.
FIELD_IDENTIFIER
)
{
if
(
directToField
)
{
getter
=
null
;
setter
=
null
;
}
...
...
@@ -383,15 +398,7 @@ public class ExpressionCodegen extends JetVisitor {
getter
=
propertyDescriptor
.
getGetter
()
==
null
?
null
:
typeMapper
.
mapGetterSignature
(
propertyDescriptor
);
setter
=
propertyDescriptor
.
getSetter
()
==
null
?
null
:
typeMapper
.
mapSetterSignature
(
propertyDescriptor
);
}
if
(!
isStatic
)
{
ensureReceiverOnStack
(
expression
);
}
myStack
.
push
(
StackValue
.
property
(
descriptor
.
getName
(),
owner
,
typeMapper
.
mapType
(
outType
),
isStatic
,
getter
,
setter
));
}
else
{
throw
new
UnsupportedOperationException
(
"don't know how to generate reference "
+
descriptor
);
}
}
return
StackValue
.
property
(
propertyDescriptor
.
getName
(),
owner
,
typeMapper
.
mapType
(
outType
),
isStatic
,
getter
,
setter
);
}
@Nullable
...
...
idea/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
浏览文件 @
2c7500c6
...
...
@@ -6,8 +6,13 @@ import org.jetbrains.jet.lang.psi.*;
import
org.jetbrains.jet.lang.resolve.AnalyzingUtils
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.types.JetStandardLibrary
;
import
org.jetbrains.jet.lang.types.PropertyDescriptor
;
import
org.objectweb.asm.ClassVisitor
;
import
org.objectweb.asm.MethodVisitor
;
import
org.objectweb.asm.Opcodes
;
import
org.objectweb.asm.Type
;
import
org.objectweb.asm.commons.InstructionAdapter
;
import
org.objectweb.asm.commons.Method
;
/**
* @author max
...
...
@@ -40,6 +45,10 @@ public class NamespaceCodegen {
final
PropertyCodegen
propertyCodegen
=
new
PropertyCodegen
(
v
,
standardLibrary
,
bindingContext
,
functionCodegen
);
final
ClassCodegen
classCodegen
=
codegens
.
forClass
(
bindingContext
);
if
(
hasNonConstantPropertyInitializers
(
namespace
))
{
generateStaticInitializers
(
namespace
,
bindingContext
);
}
for
(
JetDeclaration
declaration
:
namespace
.
getDeclarations
())
{
if
(
declaration
instanceof
JetProperty
)
{
propertyCodegen
.
genInNamespace
((
JetProperty
)
declaration
);
...
...
@@ -53,6 +62,45 @@ public class NamespaceCodegen {
}
}
private
void
generateStaticInitializers
(
JetNamespace
namespace
,
BindingContext
bindingContext
)
{
MethodVisitor
mv
=
v
.
visitMethod
(
Opcodes
.
ACC_PUBLIC
|
Opcodes
.
ACC_STATIC
,
"<clinit>"
,
new
Method
(
"<clinit>"
,
Type
.
VOID_TYPE
,
new
Type
[
0
]).
getDescriptor
(),
null
,
null
);
mv
.
visitCode
();
FrameMap
frameMap
=
new
FrameMap
();
JetTypeMapper
typeMapper
=
new
JetTypeMapper
(
JetStandardLibrary
.
getJetStandardLibrary
(
namespace
.
getProject
()),
bindingContext
);
ExpressionCodegen
codegen
=
new
ExpressionCodegen
(
mv
,
bindingContext
,
frameMap
,
typeMapper
,
Type
.
VOID_TYPE
);
for
(
JetDeclaration
declaration
:
namespace
.
getDeclarations
())
{
if
(
declaration
instanceof
JetProperty
)
{
final
JetExpression
initializer
=
((
JetProperty
)
declaration
).
getInitializer
();
if
(
initializer
!=
null
&&
!(
initializer
instanceof
JetConstantExpression
))
{
final
PropertyDescriptor
descriptor
=
(
PropertyDescriptor
)
bindingContext
.
getVariableDescriptor
((
JetProperty
)
declaration
);
codegen
.
genToJVMStack
(
initializer
);
codegen
.
intermediateValueForProperty
(
descriptor
,
false
).
store
(
new
InstructionAdapter
(
mv
));
}
}
}
mv
.
visitInsn
(
Opcodes
.
RETURN
);
mv
.
visitMaxs
(
0
,
0
);
mv
.
visitEnd
();
}
private
static
boolean
hasNonConstantPropertyInitializers
(
JetNamespace
namespace
)
{
for
(
JetDeclaration
declaration
:
namespace
.
getDeclarations
())
{
if
(
declaration
instanceof
JetProperty
)
{
final
JetExpression
initializer
=
((
JetProperty
)
declaration
).
getInitializer
();
if
(
initializer
!=
null
&&
!(
initializer
instanceof
JetConstantExpression
))
{
return
true
;
}
}
}
return
false
;
}
public
void
done
()
{
v
.
visitEnd
();
}
...
...
idea/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
浏览文件 @
2c7500c6
...
...
@@ -82,4 +82,11 @@ public class PropertyGenTest extends CodegenTestCase {
assertEquals
(
349
,
getFoo
.
invoke
(
instance
));
assertNull
(
findMethodByName
(
aClass
,
"setFoo"
));
}
public
void
testInitializersForNamespaceProperties
()
throws
Exception
{
loadText
(
"public val x = System.currentTimeMillis()"
);
System
.
out
.
println
(
generateToText
());
final
Method
method
=
generateFunction
(
"getX"
);
assertIsCurrentTime
((
Long
)
method
.
invoke
(
null
));
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录