Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
99cc2686
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,发现更多精彩内容 >>
提交
99cc2686
编写于
5月 21, 2012
作者:
S
Stepan Koltsov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
jvm backend: use JvmClassName instead of String
上级
724f69bc
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
71 addition
and
58 deletion
+71
-58
compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
...ckend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
+4
-2
compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java
...ckend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java
+26
-24
compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
...backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
+13
-11
compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
...kend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+7
-7
compiler/backend/src/org/jetbrains/jet/codegen/GeneratedAnonymousClassDescriptor.java
...brains/jet/codegen/GeneratedAnonymousClassDescriptor.java
+4
-3
compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
...ackend/src/org/jetbrains/jet/codegen/GenerationState.java
+4
-3
compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
.../backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
+4
-2
compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
...src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
+9
-6
未找到文件。
compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
浏览文件 @
99cc2686
...
...
@@ -16,9 +16,11 @@
package
org.jetbrains.jet.codegen
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.jet.lang.psi.JetFile
;
import
org.jetbrains.jet.lang.psi.JetPsiUtil
;
import
org.jetbrains.jet.lang.resolve.FqName
;
import
org.jetbrains.jet.lang.resolve.java.JvmClassName
;
import
javax.inject.Inject
;
import
java.util.*
;
...
...
@@ -55,8 +57,8 @@ public class ClassFileFactory {
return
answer
;
}
ClassBuilder
forAnonymousSubclass
(
String
className
)
{
return
newVisitor
(
className
+
".class"
);
ClassBuilder
forAnonymousSubclass
(
@NotNull
JvmClassName
className
)
{
return
newVisitor
(
className
.
getInternalName
()
+
".class"
);
}
NamespaceCodegen
forNamespace
(
JetFile
file
)
{
...
...
compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java
浏览文件 @
99cc2686
...
...
@@ -25,6 +25,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import
org.jetbrains.jet.lang.resolve.DescriptorUtils
;
import
org.jetbrains.jet.lang.resolve.FqName
;
import
org.jetbrains.jet.lang.resolve.java.JvmAbi
;
import
org.jetbrains.jet.lang.resolve.java.JvmClassName
;
import
org.jetbrains.jet.lang.resolve.scopes.JetScope
;
import
org.jetbrains.jet.lang.types.lang.JetStandardClasses
;
...
...
@@ -36,8 +37,8 @@ import java.util.*;
* @author alex.tkachman
*/
public
class
ClosureAnnotator
{
private
final
Map
<
JetElement
,
String
>
classNamesForAnonymousClasses
=
new
HashMap
<
JetElement
,
String
>();
private
final
Map
<
ClassDescriptor
,
String
>
classNamesForClassDescriptor
=
new
HashMap
<
ClassDescriptor
,
String
>();
private
final
Map
<
JetElement
,
JvmClassName
>
classNamesForAnonymousClasses
=
new
HashMap
<
JetElement
,
JvmClassName
>();
private
final
Map
<
ClassDescriptor
,
JvmClassName
>
classNamesForClassDescriptor
=
new
HashMap
<
ClassDescriptor
,
JvmClassName
>();
private
final
Map
<
String
,
Integer
>
anonymousSubclassesCount
=
new
HashMap
<
String
,
Integer
>();
private
final
Map
<
FunctionDescriptor
,
ClassDescriptorImpl
>
classesForFunctions
=
new
HashMap
<
FunctionDescriptor
,
ClassDescriptorImpl
>();
private
final
Map
<
DeclarationDescriptor
,
ClassDescriptor
>
enclosing
=
new
HashMap
<
DeclarationDescriptor
,
ClassDescriptor
>();
...
...
@@ -64,7 +65,7 @@ public class ClosureAnnotator {
}
public
ClassDescriptor
classDescriptorForFunctionDescriptor
(
FunctionDescriptor
funDescriptor
,
String
name
)
{
public
ClassDescriptor
classDescriptorForFunctionDescriptor
(
FunctionDescriptor
funDescriptor
,
JvmClassName
name
)
{
ClassDescriptorImpl
classDescriptor
=
classesForFunctions
.
get
(
funDescriptor
);
if
(
classDescriptor
==
null
)
{
int
arity
=
funDescriptor
.
getValueParameters
().
size
();
...
...
@@ -72,7 +73,8 @@ public class ClosureAnnotator {
classDescriptor
=
new
ClassDescriptorImpl
(
funDescriptor
,
Collections
.<
AnnotationDescriptor
>
emptyList
(),
name
);
// TODO: internal name used as identifier
name
.
getInternalName
());
// TODO:
classDescriptor
.
initialize
(
false
,
Collections
.<
TypeParameterDescriptor
>
emptyList
(),
...
...
@@ -98,7 +100,7 @@ public class ClosureAnnotator {
}
}
public
String
classNameForAnonymousClass
(
JetElement
expression
)
{
public
JvmClassName
classNameForAnonymousClass
(
JetElement
expression
)
{
if
(
expression
instanceof
JetObjectLiteralExpression
)
{
JetObjectLiteralExpression
jetObjectLiteralExpression
=
(
JetObjectLiteralExpression
)
expression
;
expression
=
jetObjectLiteralExpression
.
getObjectDeclaration
();
...
...
@@ -109,7 +111,7 @@ public class ClosureAnnotator {
expression
=
jetFunctionLiteralExpression
.
getFunctionLiteral
();
}
String
name
=
classNamesForAnonymousClasses
.
get
(
expression
);
JvmClassName
name
=
classNamesForAnonymousClasses
.
get
(
expression
);
assert
name
!=
null
;
return
name
;
}
...
...
@@ -137,8 +139,8 @@ public class ClosureAnnotator {
}
}
private
String
recordAnonymousClass
(
JetElement
declaration
)
{
String
name
=
classNamesForAnonymousClasses
.
get
(
declaration
);
private
JvmClassName
recordAnonymousClass
(
JetElement
declaration
)
{
JvmClassName
name
=
classNamesForAnonymousClasses
.
get
(
declaration
);
assert
name
==
null
;
String
top
=
nameStack
.
peek
();
...
...
@@ -146,18 +148,18 @@ public class ClosureAnnotator {
if
(
cnt
==
null
)
{
cnt
=
0
;
}
name
=
top
+
"$"
+
(
cnt
+
1
);
name
=
JvmClassName
.
byInternalName
(
top
+
"$"
+
(
cnt
+
1
)
);
classNamesForAnonymousClasses
.
put
(
declaration
,
name
);
anonymousSubclassesCount
.
put
(
top
,
cnt
+
1
);
return
name
;
}
private
String
recordClassObject
(
JetClassObject
declaration
)
{
String
name
=
classNamesForAnonymousClasses
.
get
(
declaration
.
getObjectDeclaration
());
private
JvmClassName
recordClassObject
(
JetClassObject
declaration
)
{
JvmClassName
name
=
classNamesForAnonymousClasses
.
get
(
declaration
.
getObjectDeclaration
());
assert
name
==
null
;
name
=
nameStack
.
peek
()
+
JvmAbi
.
CLASS_OBJECT_SUFFIX
;
name
=
JvmClassName
.
byInternalName
(
nameStack
.
peek
()
+
JvmAbi
.
CLASS_OBJECT_SUFFIX
)
;
classNamesForAnonymousClasses
.
put
(
declaration
.
getObjectDeclaration
(),
name
);
return
name
;
...
...
@@ -178,12 +180,12 @@ public class ClosureAnnotator {
@Override
public
void
visitClassObject
(
JetClassObject
classObject
)
{
String
name
=
recordClassObject
(
classObject
);
JvmClassName
name
=
recordClassObject
(
classObject
);
ClassDescriptor
classDescriptor
=
bindingContext
.
get
(
BindingContext
.
CLASS
,
classObject
.
getObjectDeclaration
());
recordEnclosing
(
classDescriptor
);
recordName
(
classDescriptor
,
name
);
classStack
.
push
(
classDescriptor
);
nameStack
.
push
(
name
);
nameStack
.
push
(
name
.
getInternalName
()
);
super
.
visitClassObject
(
classObject
);
nameStack
.
pop
();
classStack
.
pop
();
...
...
@@ -232,12 +234,12 @@ public class ClosureAnnotator {
@Override
public
void
visitObjectLiteralExpression
(
JetObjectLiteralExpression
expression
)
{
String
name
=
recordAnonymousClass
(
expression
.
getObjectDeclaration
());
JvmClassName
name
=
recordAnonymousClass
(
expression
.
getObjectDeclaration
());
ClassDescriptor
classDescriptor
=
bindingContext
.
get
(
BindingContext
.
CLASS
,
expression
.
getObjectDeclaration
());
recordName
(
classDescriptor
,
name
);
recordEnclosing
(
classDescriptor
);
classStack
.
push
(
classDescriptor
);
nameStack
.
push
(
classNameForClassDescriptor
(
classDescriptor
));
nameStack
.
push
(
classNameForClassDescriptor
(
classDescriptor
)
.
getInternalName
()
);
super
.
visitObjectLiteralExpression
(
expression
);
nameStack
.
pop
();
classStack
.
pop
();
...
...
@@ -245,7 +247,7 @@ public class ClosureAnnotator {
@Override
public
void
visitFunctionLiteralExpression
(
JetFunctionLiteralExpression
expression
)
{
String
name
=
recordAnonymousClass
(
expression
.
getFunctionLiteral
());
JvmClassName
name
=
recordAnonymousClass
(
expression
.
getFunctionLiteral
());
FunctionDescriptor
declarationDescriptor
=
(
FunctionDescriptor
)
bindingContext
.
get
(
BindingContext
.
DECLARATION_TO_DESCRIPTOR
,
expression
);
// working around a problem with shallow analysis
if
(
declarationDescriptor
==
null
)
return
;
...
...
@@ -253,7 +255,7 @@ public class ClosureAnnotator {
recordName
(
classDescriptor
,
name
);
recordEnclosing
(
classDescriptor
);
classStack
.
push
(
classDescriptor
);
nameStack
.
push
(
classNameForClassDescriptor
(
classDescriptor
));
nameStack
.
push
(
classNameForClassDescriptor
(
classDescriptor
)
.
getInternalName
()
);
super
.
visitFunctionLiteralExpression
(
expression
);
nameStack
.
pop
();
classStack
.
pop
();
...
...
@@ -261,8 +263,8 @@ public class ClosureAnnotator {
// TODO: please insert either @NotNull or @Nullable here
// stepan.koltsov@ 2012-04-08
private
void
recordName
(
ClassDescriptor
classDescriptor
,
@NotNull
String
name
)
{
String
old
=
classNamesForClassDescriptor
.
put
(
classDescriptor
,
name
);
private
void
recordName
(
ClassDescriptor
classDescriptor
,
@NotNull
JvmClassName
name
)
{
JvmClassName
old
=
classNamesForClassDescriptor
.
put
(
classDescriptor
,
name
);
if
(
old
==
null
)
{
// TODO: fix this assertion
// previosly here was incorrect assert that was ignored without -ea
...
...
@@ -300,12 +302,12 @@ public class ClosureAnnotator {
nameStack
.
pop
();
}
else
{
String
name
=
recordAnonymousClass
(
function
);
JvmClassName
name
=
recordAnonymousClass
(
function
);
ClassDescriptor
classDescriptor
=
classDescriptorForFunctionDescriptor
(
functionDescriptor
,
name
);
recordName
(
classDescriptor
,
name
);
recordEnclosing
(
classDescriptor
);
classStack
.
push
(
classDescriptor
);
nameStack
.
push
(
name
);
nameStack
.
push
(
name
.
getInternalName
()
);
super
.
visitNamedFunction
(
function
);
nameStack
.
pop
();
classStack
.
pop
();
...
...
@@ -313,8 +315,8 @@ public class ClosureAnnotator {
}
}
public
String
classNameForClassDescriptor
(
ClassDescriptor
classDescriptor
)
{
String
name
=
classNamesForClassDescriptor
.
get
(
classDescriptor
);
public
JvmClassName
classNameForClassDescriptor
(
ClassDescriptor
classDescriptor
)
{
JvmClassName
name
=
classNamesForClassDescriptor
.
get
(
classDescriptor
);
assert
name
!=
null
;
return
name
;
}
...
...
compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
浏览文件 @
99cc2686
...
...
@@ -31,6 +31,7 @@ import org.jetbrains.jet.lang.psi.JetElement;
import
org.jetbrains.jet.lang.psi.JetExpression
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.resolve.BindingContextUtils
;
import
org.jetbrains.jet.lang.resolve.java.JvmClassName
;
import
org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.jetbrains.jet.lang.types.lang.JetStandardClasses
;
...
...
@@ -102,7 +103,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
public
GeneratedAnonymousClassDescriptor
gen
(
JetExpression
fun
)
{
final
Pair
<
String
,
ClassBuilder
>
nameAndVisitor
=
state
.
forAnonymousSubclass
(
fun
);
final
Pair
<
JvmClassName
,
ClassBuilder
>
nameAndVisitor
=
state
.
forAnonymousSubclass
(
fun
);
final
FunctionDescriptor
funDescriptor
=
(
FunctionDescriptor
)
bindingContext
.
get
(
BindingContext
.
DECLARATION_TO_DESCRIPTOR
,
fun
);
...
...
@@ -124,7 +125,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
cv
.
defineClass
(
fun
,
V1_6
,
ACC_PUBLIC
/*|ACC_SUPER*/
,
name
,
name
.
getInternalName
()
,
null
,
funClass
,
new
String
[
0
]
...
...
@@ -132,7 +133,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
cv
.
visitSource
(
fun
.
getContainingFile
().
getName
(),
null
);
generateBridge
(
name
,
funDescriptor
,
fun
,
cv
);
generateBridge
(
name
.
getInternalName
()
,
funDescriptor
,
fun
,
cv
);
captureThis
=
generateBody
(
funDescriptor
,
cv
,
(
JetDeclarationWithBody
)
fun
);
ClassDescriptor
thisDescriptor
=
context
.
getThisDescriptor
();
final
Type
enclosingType
=
thisDescriptor
==
null
?
null
:
state
.
getInjector
().
getJetTypeMapper
().
mapType
(
thisDescriptor
.
getDefaultType
(),
MapTypeMode
.
VALUE
);
...
...
@@ -166,7 +167,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
private
void
generateConstInstance
(
PsiElement
fun
)
{
String
classDescr
=
"L"
+
name
+
";"
;
String
classDescr
=
name
.
getDescriptor
()
;
cv
.
newField
(
fun
,
ACC_PRIVATE
|
ACC_STATIC
|
ACC_FINAL
,
"$instance"
,
classDescr
,
null
,
null
);
MethodVisitor
mv
=
cv
.
newMethod
(
fun
,
ACC_PUBLIC
|
ACC_STATIC
,
"$getInstance"
,
"()"
+
classDescr
,
null
,
new
String
[
0
]);
...
...
@@ -175,17 +176,17 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
else
if
(
state
.
getClassBuilderMode
()
==
ClassBuilderMode
.
FULL
)
{
mv
.
visitCode
();
mv
.
visitFieldInsn
(
GETSTATIC
,
name
,
"$instance"
,
classDescr
);
mv
.
visitFieldInsn
(
GETSTATIC
,
name
.
getInternalName
()
,
"$instance"
,
classDescr
);
mv
.
visitInsn
(
DUP
);
Label
ret
=
new
Label
();
mv
.
visitJumpInsn
(
IFNONNULL
,
ret
);
mv
.
visitInsn
(
POP
);
mv
.
visitTypeInsn
(
NEW
,
name
);
mv
.
visitTypeInsn
(
NEW
,
name
.
getInternalName
()
);
mv
.
visitInsn
(
DUP
);
mv
.
visitMethodInsn
(
INVOKESPECIAL
,
name
,
"<init>"
,
"()V"
);
mv
.
visitMethodInsn
(
INVOKESPECIAL
,
name
.
getInternalName
()
,
"<init>"
,
"()V"
);
mv
.
visitInsn
(
DUP
);
mv
.
visitFieldInsn
(
PUTSTATIC
,
name
,
"$instance"
,
classDescr
);
mv
.
visitFieldInsn
(
PUTSTATIC
,
name
.
getInternalName
()
,
"$instance"
,
classDescr
);
mv
.
visitLabel
(
ret
);
mv
.
visitInsn
(
ARETURN
);
...
...
@@ -196,7 +197,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
private
Type
generateBody
(
FunctionDescriptor
funDescriptor
,
ClassBuilder
cv
,
JetDeclarationWithBody
body
)
{
ClassDescriptor
function
=
state
.
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classDescriptorForFunctionDescriptor
(
funDescriptor
,
name
);
final
CodegenContext
.
ClosureContext
closureContext
=
context
.
intoClosure
(
funDescriptor
,
function
,
name
,
this
,
state
.
getInjector
().
getJetTypeMapper
());
final
CodegenContext
.
ClosureContext
closureContext
=
context
.
intoClosure
(
funDescriptor
,
function
,
name
.
getInternalName
(),
this
,
state
.
getInjector
().
getJetTypeMapper
());
FunctionCodegen
fc
=
new
FunctionCodegen
(
closureContext
,
cv
,
state
);
JvmMethodSignature
jvmMethodSignature
=
invokeSignature
(
funDescriptor
);
fc
.
generateMethod
(
body
,
jvmMethodSignature
,
false
,
null
,
funDescriptor
);
...
...
@@ -289,7 +291,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
argTypes
[
i
++]
=
type
;
}
else
if
(
CodegenUtil
.
isNamedFun
(
descriptor
,
state
.
getBindingContext
())
&&
descriptor
.
getContainingDeclaration
()
instanceof
FunctionDescriptor
)
{
final
Type
type
=
Type
.
getObjectType
(
state
.
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classNameForAnonymousClass
((
JetElement
)
BindingContextUtils
.
descriptorToDeclaration
(
bindingContext
,
descriptor
))
);
final
Type
type
=
state
.
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classNameForAnonymousClass
((
JetElement
)
BindingContextUtils
.
descriptorToDeclaration
(
bindingContext
,
descriptor
)).
getAsmType
(
);
argTypes
[
i
++]
=
type
;
}
}
...
...
@@ -325,7 +327,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
i
+=
type
.
getSize
();
StackValue
.
field
(
type
,
name
,
fieldName
,
false
).
store
(
iv
);
StackValue
.
field
(
type
,
name
.
getInternalName
()
,
fieldName
,
false
).
store
(
iv
);
}
iv
.
visitInsn
(
RETURN
);
...
...
compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
99cc2686
...
...
@@ -752,10 +752,10 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
final
GeneratedAnonymousClassDescriptor
closure
=
closureCodegen
.
gen
(
expression
);
if
(
closureCodegen
.
isConst
())
{
v
.
invokestatic
(
closure
.
getClassname
()
,
"$getInstance"
,
"()L"
+
closure
.
getClassname
()
+
";"
);
v
.
invokestatic
(
closure
.
getClassname
()
.
getInternalName
(),
"$getInstance"
,
"()"
+
closure
.
getClassname
().
getDescriptor
()
);
}
else
{
v
.
anew
(
Type
.
getObjectType
(
closure
.
getClassname
()
));
v
.
anew
(
closure
.
getClassname
().
getAsmType
(
));
v
.
dup
();
final
Method
cons
=
closure
.
getConstructor
();
...
...
@@ -776,16 +776,16 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
arg
.
put
(
cons
.
getArgumentTypes
()[
i
+
k
],
v
);
}
v
.
invokespecial
(
closure
.
getClassname
(),
"<init>"
,
cons
.
getDescriptor
());
v
.
invokespecial
(
closure
.
getClassname
()
.
getInternalName
()
,
"<init>"
,
cons
.
getDescriptor
());
}
return
StackValue
.
onStack
(
Type
.
getObjectType
(
closure
.
getClassname
()
));
return
StackValue
.
onStack
(
closure
.
getClassname
().
getAsmType
(
));
}
@Override
public
StackValue
visitObjectLiteralExpression
(
JetObjectLiteralExpression
expression
,
StackValue
receiver
)
{
ObjectOrClosureCodegen
closureCodegen
=
new
ObjectOrClosureCodegen
(
this
,
context
,
state
);
GeneratedAnonymousClassDescriptor
closure
=
state
.
generateObjectLiteral
(
expression
,
closureCodegen
);
Type
type
=
Type
.
getObjectType
(
closure
.
getClassname
()
);
Type
type
=
closure
.
getClassname
().
getAsmType
(
);
v
.
anew
(
type
);
v
.
dup
();
final
List
<
Type
>
consArgTypes
=
new
LinkedList
<
Type
>(
Arrays
.
asList
(
closure
.
getConstructor
().
getArgumentTypes
()));
...
...
@@ -819,8 +819,8 @@ public class ExpressionCodegen extends JetVisitor<StackValue, StackValue> {
}
Method
cons
=
new
Method
(
"<init>"
,
Type
.
VOID_TYPE
,
consArgTypes
.
toArray
(
new
Type
[
consArgTypes
.
size
()]));
v
.
invokespecial
(
closure
.
getClassname
(),
"<init>"
,
cons
.
getDescriptor
());
return
StackValue
.
onStack
(
Type
.
getObjectType
(
closure
.
getClassname
()
));
v
.
invokespecial
(
closure
.
getClassname
()
.
getInternalName
()
,
"<init>"
,
cons
.
getDescriptor
());
return
StackValue
.
onStack
(
closure
.
getClassname
().
getAsmType
(
));
}
private
Label
continueLabel
;
...
...
compiler/backend/src/org/jetbrains/jet/codegen/GeneratedAnonymousClassDescriptor.java
浏览文件 @
99cc2686
...
...
@@ -19,6 +19,7 @@
*/
package
org.jetbrains.jet.codegen
;
import
org.jetbrains.jet.lang.resolve.java.JvmClassName
;
import
org.objectweb.asm.Type
;
import
org.objectweb.asm.commons.Method
;
...
...
@@ -26,20 +27,20 @@ import java.util.ArrayList;
import
java.util.List
;
public
class
GeneratedAnonymousClassDescriptor
{
private
final
String
classname
;
private
final
JvmClassName
classname
;
private
Method
constructor
;
private
final
Type
captureThis
;
private
final
Type
captureReceiver
;
private
List
<
StackValue
>
args
=
new
ArrayList
<
StackValue
>();
public
GeneratedAnonymousClassDescriptor
(
String
classname
,
Method
constructor
,
Type
captureThis
,
Type
captureReceiver
)
{
public
GeneratedAnonymousClassDescriptor
(
JvmClassName
classname
,
Method
constructor
,
Type
captureThis
,
Type
captureReceiver
)
{
this
.
classname
=
classname
;
this
.
constructor
=
constructor
;
this
.
captureThis
=
captureThis
;
this
.
captureReceiver
=
captureReceiver
;
}
public
String
getClassname
()
{
public
JvmClassName
getClassname
()
{
return
classname
;
}
...
...
compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
浏览文件 @
99cc2686
...
...
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.psi.JetObjectDeclaration;
import
org.jetbrains.jet.lang.psi.JetObjectLiteralExpression
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
import
org.jetbrains.jet.lang.resolve.java.CompilerSpecialMode
;
import
org.jetbrains.jet.lang.resolve.java.JvmClassName
;
import
org.jetbrains.jet.utils.Progress
;
import
java.util.List
;
...
...
@@ -99,8 +100,8 @@ public class GenerationState {
return
getFactory
().
newVisitor
(
getInjector
().
getJetTypeMapper
().
mapType
(
aClass
.
getDefaultType
(),
MapTypeMode
.
TRAIT_IMPL
).
getInternalName
()
+
".class"
);
}
public
Pair
<
String
,
ClassBuilder
>
forAnonymousSubclass
(
JetExpression
expression
)
{
String
className
=
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classNameForAnonymousClass
(
expression
);
public
Pair
<
JvmClassName
,
ClassBuilder
>
forAnonymousSubclass
(
JetExpression
expression
)
{
JvmClassName
className
=
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classNameForAnonymousClass
(
expression
);
return
Pair
.
create
(
className
,
getFactory
().
forAnonymousSubclass
(
className
));
}
...
...
@@ -137,7 +138,7 @@ public class GenerationState {
public
GeneratedAnonymousClassDescriptor
generateObjectLiteral
(
JetObjectLiteralExpression
literal
,
ObjectOrClosureCodegen
closure
)
{
JetObjectDeclaration
objectDeclaration
=
literal
.
getObjectDeclaration
();
Pair
<
String
,
ClassBuilder
>
nameAndVisitor
=
forAnonymousSubclass
(
objectDeclaration
);
Pair
<
JvmClassName
,
ClassBuilder
>
nameAndVisitor
=
forAnonymousSubclass
(
objectDeclaration
);
closure
.
cv
=
nameAndVisitor
.
getSecond
();
closure
.
name
=
nameAndVisitor
.
getFirst
();
...
...
compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
浏览文件 @
99cc2686
...
...
@@ -320,7 +320,9 @@ public class JetTypeMapper {
DeclarationDescriptor
container
=
descriptor
.
getContainingDeclaration
();
String
name
=
descriptor
.
getName
();
if
(
JetPsiUtil
.
NO_NAME_PROVIDED
.
equals
(
name
))
{
return
closureAnnotator
.
classNameForAnonymousClass
((
JetElement
)
BindingContextUtils
.
descriptorToDeclaration
(
bindingContext
,
descriptor
));
return
closureAnnotator
.
classNameForAnonymousClass
((
JetElement
)
BindingContextUtils
.
descriptorToDeclaration
(
bindingContext
,
descriptor
))
.
getInternalName
();
}
if
(
name
.
contains
(
"/"
))
return
name
;
...
...
@@ -978,7 +980,7 @@ public class JetTypeMapper {
}
else
if
(
descriptor
instanceof
SimpleFunctionDescriptor
&&
descriptor
.
getContainingDeclaration
()
instanceof
FunctionDescriptor
)
{
PsiElement
psiElement
=
BindingContextUtils
.
descriptorToDeclaration
(
bindingContext
,
descriptor
);
return
Type
.
getObjectType
(
closureAnnotator
.
classNameForAnonymousClass
((
JetElement
)
psiElement
)
);
return
closureAnnotator
.
classNameForAnonymousClass
((
JetElement
)
psiElement
).
getAsmType
(
);
}
else
if
(
descriptor
instanceof
FunctionDescriptor
)
{
return
StackValue
.
sharedTypeForType
(
mapType
(((
FunctionDescriptor
)
descriptor
).
getReceiverParameter
().
getType
(),
MapTypeMode
.
VALUE
));
...
...
compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
浏览文件 @
99cc2686
...
...
@@ -20,6 +20,7 @@ import org.jetbrains.jet.lang.descriptors.*;
import
org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall
;
import
org.jetbrains.jet.lang.psi.JetElement
;
import
org.jetbrains.jet.lang.resolve.BindingContextUtils
;
import
org.jetbrains.jet.lang.resolve.java.JvmClassName
;
import
org.objectweb.asm.Opcodes
;
import
org.objectweb.asm.Type
;
...
...
@@ -37,7 +38,7 @@ public class ObjectOrClosureCodegen {
protected
final
ExpressionCodegen
exprContext
;
protected
final
CodegenContext
context
;
protected
ClassBuilder
cv
=
null
;
public
String
name
=
null
;
public
JvmClassName
name
=
null
;
protected
Map
<
DeclarationDescriptor
,
EnclosedValueDescriptor
>
closure
=
new
LinkedHashMap
<
DeclarationDescriptor
,
EnclosedValueDescriptor
>();
public
JetDelegatorToSuperCall
superCall
;
...
...
@@ -66,7 +67,9 @@ public class ObjectOrClosureCodegen {
StackValue
outerValue
=
StackValue
.
local
(
idx
,
type
);
final
String
fieldName
=
"$"
+
vd
.
getName
();
StackValue
innerValue
=
sharedVarType
!=
null
?
StackValue
.
fieldForSharedVar
(
localType
,
name
,
fieldName
)
:
StackValue
.
field
(
type
,
name
,
fieldName
,
false
);
StackValue
innerValue
=
sharedVarType
!=
null
?
StackValue
.
fieldForSharedVar
(
localType
,
name
.
getInternalName
(),
fieldName
)
:
StackValue
.
field
(
type
,
name
.
getInternalName
(),
fieldName
,
false
);
cv
.
newField
(
null
,
Opcodes
.
ACC_PUBLIC
,
fieldName
,
type
.
getDescriptor
(),
null
,
null
);
...
...
@@ -83,12 +86,12 @@ public class ObjectOrClosureCodegen {
if
(
idx
<
0
)
return
null
;
JetElement
expression
=
(
JetElement
)
BindingContextUtils
.
callableDescriptorToDeclaration
(
state
.
getBindingContext
(),
vd
);
String
cn
=
state
.
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classNameForAnonymousClass
(
expression
);
Type
localType
=
Type
.
getObjectType
(
cn
);
JvmClassName
cn
=
state
.
getInjector
().
getJetTypeMapper
().
getClosureAnnotator
().
classNameForAnonymousClass
(
expression
);
Type
localType
=
cn
.
getAsmType
(
);
StackValue
outerValue
=
StackValue
.
local
(
idx
,
localType
);
final
String
fieldName
=
"$"
+
vd
.
getName
();
StackValue
innerValue
=
StackValue
.
field
(
localType
,
name
,
fieldName
,
false
);
StackValue
innerValue
=
StackValue
.
field
(
localType
,
name
.
getInternalName
()
,
fieldName
,
false
);
cv
.
newField
(
null
,
Opcodes
.
ACC_PUBLIC
,
fieldName
,
localType
.
getDescriptor
(),
null
,
null
);
...
...
@@ -114,7 +117,7 @@ public class ObjectOrClosureCodegen {
boolean
isStatic
=
fcontext
.
getContextDescriptor
().
getContainingDeclaration
()
instanceof
NamespaceDescriptor
;
StackValue
outerValue
=
StackValue
.
local
(
isStatic
?
0
:
1
,
type
);
final
String
fieldName
=
"receiver$0"
;
StackValue
innerValue
=
StackValue
.
field
(
type
,
name
,
fieldName
,
false
);
StackValue
innerValue
=
StackValue
.
field
(
type
,
name
.
getInternalName
()
,
fieldName
,
false
);
cv
.
newField
(
null
,
Opcodes
.
ACC_PUBLIC
,
fieldName
,
type
.
getDescriptor
(),
null
,
null
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录