Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
74fe24ef
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,发现更多精彩内容 >>
提交
74fe24ef
编写于
12月 01, 2011
作者:
A
Alex Tkachman
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactoring of property handling and general handling of (this,receiver)
上级
aad2d17c
变更
10
展开全部
隐藏空白更改
内联
并排
Showing
10 changed file
with
408 addition
and
404 deletion
+408
-404
compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java
...backend/src/org/jetbrains/jet/codegen/CallableMethod.java
+9
-0
compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
...backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
+8
-5
compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
...kend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+277
-355
compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
...ler/backend/src/org/jetbrains/jet/codegen/StackValue.java
+102
-40
compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethod.java
...org/jetbrains/jet/codegen/intrinsics/IntrinsicMethod.java
+2
-1
compiler/backend/src/org/jetbrains/jet/compiler/CompileEnvironment.java
...nd/src/org/jetbrains/jet/compiler/CompileEnvironment.java
+6
-2
compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java
...d/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java
+1
-1
compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java
...sts/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java
+1
-0
compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java
compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java
+1
-0
compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
...iler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
+1
-0
未找到文件。
compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java
浏览文件 @
74fe24ef
...
...
@@ -5,6 +5,7 @@ import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
import
org.jetbrains.jet.lang.descriptors.ClassDescriptor
;
import
org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
;
import
org.jetbrains.jet.lang.descriptors.FunctionDescriptor
;
import
org.jetbrains.jet.lang.types.JetType
;
import
org.objectweb.asm.Opcodes
;
import
org.objectweb.asm.Type
;
import
org.objectweb.asm.commons.InstructionAdapter
;
...
...
@@ -53,6 +54,14 @@ public class CallableMethod implements Callable {
this
.
receiverFunction
=
receiverClass
;
}
public
JetType
getThisType
()
{
return
thisClass
.
getDefaultType
();
}
public
JetType
getReceiverClass
()
{
return
receiverFunction
.
getReceiverParameter
().
getType
();
}
public
void
setNeedsThis
(
@Nullable
ClassDescriptor
receiverClass
)
{
this
.
thisClass
=
receiverClass
;
}
...
...
compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
浏览文件 @
74fe24ef
...
...
@@ -5,8 +5,11 @@
package
org.jetbrains.jet.codegen
;
import
com.intellij.openapi.util.Pair
;
import
com.intellij.psi.PsiElement
;
import
org.jetbrains.jet.lang.descriptors.*
;
import
org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor
;
import
org.jetbrains.jet.lang.psi.JetDeclarationWithBody
;
import
org.jetbrains.jet.lang.psi.JetExpression
;
import
org.jetbrains.jet.lang.psi.JetFunctionLiteral
;
import
org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression
;
import
org.jetbrains.jet.lang.resolve.BindingContext
;
...
...
@@ -123,7 +126,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
return
answer
;
}
private
void
generateConstInstance
(
JetFunctionLiteralExpression
fun
)
{
private
void
generateConstInstance
(
PsiElement
fun
)
{
String
classDescr
=
"L"
+
name
+
";"
;
cv
.
newField
(
fun
,
ACC_PRIVATE
|
ACC_STATIC
,
"$instance"
,
classDescr
,
null
,
null
);
...
...
@@ -149,7 +152,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
}
private
boolean
generateBody
(
FunctionDescriptor
funDescriptor
,
ClassBuilder
cv
,
Jet
FunctionLiteral
body
)
{
private
boolean
generateBody
(
FunctionDescriptor
funDescriptor
,
ClassBuilder
cv
,
Jet
DeclarationWithBody
body
)
{
int
arity
=
funDescriptor
.
getValueParameters
().
size
();
ClassDescriptorImpl
function
=
new
ClassDescriptorImpl
(
...
...
@@ -167,7 +170,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
return
closureContext
.
outerWasUsed
;
}
private
void
generateBridge
(
String
className
,
FunctionDescriptor
funDescriptor
,
Jet
FunctionLiteral
Expression
fun
,
ClassBuilder
cv
)
{
private
void
generateBridge
(
String
className
,
FunctionDescriptor
funDescriptor
,
JetExpression
fun
,
ClassBuilder
cv
)
{
final
Method
bridge
=
erasedInvokeSignature
(
funDescriptor
);
final
Method
delegate
=
invokeSignature
(
funDescriptor
);
...
...
@@ -207,7 +210,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
}
private
Method
generateConstructor
(
String
funClass
,
JetFunctionLiteralExpression
fun
)
{
private
Method
generateConstructor
(
String
funClass
,
PsiElement
fun
)
{
int
argCount
=
captureThis
?
1
:
0
;
argCount
+=
(
captureReceiver
!=
null
?
1
:
0
);
...
...
@@ -294,7 +297,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
signatureWriter
.
visitTypeArgument
(
variance
);
final
JetTypeMapper
typeMapper
=
state
.
getTypeMapper
();
final
Type
rawRetType
=
t
ypeMapper
.
boxType
(
typeMapper
.
mapType
(
type
));
final
Type
rawRetType
=
JetT
ypeMapper
.
boxType
(
typeMapper
.
mapType
(
type
));
signatureWriter
.
visitClassType
(
rawRetType
.
getInternalName
());
signatureWriter
.
visitEnd
();
}
...
...
compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
浏览文件 @
74fe24ef
此差异已折叠。
点击以展开。
compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
浏览文件 @
74fe24ef
package
org.jetbrains.jet.codegen
;
import
com.intellij.psi.tree.IElementType
;
import
org.jetbrains.annotations.Nullable
;
import
org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod
;
import
org.jetbrains.jet.lang.descriptors.ClassDescriptor
;
import
org.jetbrains.jet.lang.descriptors.FunctionDescriptor
;
import
org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
;
import
org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor
;
import
org.jetbrains.jet.lang.descriptors.*
;
import
org.jetbrains.jet.lang.psi.JetExpression
;
import
org.jetbrains.jet.lang.resolve.calls.ResolvedCall
;
import
org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor
;
...
...
@@ -101,11 +99,7 @@ public abstract class StackValue {
return
new
Field
(
type
,
owner
,
name
,
isStatic
);
}
public
static
StackValue
instanceField
(
Type
type
,
String
owner
,
String
name
)
{
return
new
InstanceField
(
type
,
owner
,
name
);
}
public
static
StackValue
property
(
String
name
,
String
owner
,
Type
type
,
boolean
isStatic
,
boolean
isInterface
,
boolean
isSuper
,
Method
getter
,
Method
setter
)
{
public
static
Property
property
(
String
name
,
String
owner
,
Type
type
,
boolean
isStatic
,
boolean
isInterface
,
boolean
isSuper
,
Method
getter
,
Method
setter
)
{
return
new
Property
(
name
,
owner
,
getter
,
setter
,
isStatic
,
isInterface
,
isSuper
,
type
);
}
...
...
@@ -264,6 +258,12 @@ public abstract class StackValue {
return
new
PreIncrement
(
index
,
increment
);
}
public
static
StackValue
receiver
(
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
,
StackValue
receiver
,
ExpressionCodegen
codegen
,
@Nullable
CallableMethod
callableMethod
)
{
if
(
resolvedCall
.
getThisObject
().
exists
()
||
resolvedCall
.
getReceiverArgument
().
exists
())
return
new
CallReceiver
(
resolvedCall
,
receiver
,
codegen
,
callableMethod
);
return
receiver
;
}
private
static
class
None
extends
StackValue
{
public
static
None
INSTANCE
=
new
None
();
private
None
()
{
...
...
@@ -614,7 +614,7 @@ public abstract class StackValue {
if
(
resolvedSetCall
.
getThisObject
().
exists
())
{
if
(
resolvedSetCall
.
getReceiverArgument
().
exists
())
{
codegen
.
generateFromResolvedCall
(
resolvedSetCall
.
getThisObject
());
codegen
.
generateFromResolvedCall
(
resolvedSetCall
.
getThisObject
()
,
JetTypeMapper
.
TYPE_OBJECT
);
}
v
.
load
(
realReceiverIndex
-
realReceiverType
.
getSize
(),
realReceiverType
);
}
...
...
@@ -730,39 +730,11 @@ public abstract class StackValue {
}
}
static
class
InstanceField
extends
StackValue
{
final
String
owner
;
final
String
name
;
public
InstanceField
(
Type
type
,
String
owner
,
String
name
)
{
super
(
type
);
this
.
owner
=
owner
;
this
.
name
=
name
;
}
@Override
public
void
put
(
Type
type
,
InstructionAdapter
v
)
{
v
.
load
(
0
,
JetTypeMapper
.
TYPE_OBJECT
);
v
.
getfield
(
owner
,
name
,
this
.
type
.
getDescriptor
());
coerce
(
type
,
v
);
}
@Override
public
void
dupReceiver
(
InstructionAdapter
v
)
{
}
@Override
public
void
store
(
InstructionAdapter
v
)
{
v
.
load
(
0
,
JetTypeMapper
.
TYPE_OBJECT
);
v
.
putfield
(
owner
,
name
,
this
.
type
.
getDescriptor
());
}
}
private
static
class
Property
extends
StackValue
{
static
class
Property
extends
StackValue
{
private
final
String
name
;
private
final
Method
getter
;
private
final
Method
setter
;
p
rivate
final
String
owner
;
p
ublic
final
String
owner
;
private
final
boolean
isStatic
;
private
final
boolean
isInterface
;
private
boolean
isSuper
;
...
...
@@ -1011,4 +983,94 @@ public abstract class StackValue {
}
}
}
public
static
class
CallReceiver
extends
StackValue
{
private
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
;
StackValue
receiver
;
private
ExpressionCodegen
codegen
;
private
CallableMethod
callableMethod
;
public
CallReceiver
(
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
,
StackValue
receiver
,
ExpressionCodegen
codegen
,
CallableMethod
callableMethod
)
{
super
(
calcType
(
resolvedCall
,
codegen
,
callableMethod
));
this
.
resolvedCall
=
resolvedCall
;
this
.
receiver
=
receiver
;
this
.
codegen
=
codegen
;
this
.
callableMethod
=
callableMethod
;
}
private
static
Type
calcType
(
ResolvedCall
<?
extends
CallableDescriptor
>
resolvedCall
,
ExpressionCodegen
codegen
,
CallableMethod
callableMethod
)
{
ReceiverDescriptor
thisObject
=
resolvedCall
.
getThisObject
();
ReceiverDescriptor
receiverArgument
=
resolvedCall
.
getReceiverArgument
();
CallableDescriptor
descriptor
=
resolvedCall
.
getResultingDescriptor
();
if
(
thisObject
.
exists
())
{
if
(
callableMethod
!=
null
)
{
if
(
receiverArgument
.
exists
())
{
return
codegen
.
typeMapper
.
mapType
(
callableMethod
.
getReceiverClass
());
}
else
{
return
codegen
.
typeMapper
.
mapType
(
callableMethod
.
getThisType
());
}
}
else
{
if
(
receiverArgument
.
exists
())
{
return
codegen
.
typeMapper
.
mapType
(
descriptor
.
getReceiverParameter
().
getType
());
}
else
{
return
codegen
.
typeMapper
.
mapType
(
descriptor
.
getExpectedThisObject
().
getType
());
}
}
}
else
{
if
(
receiverArgument
.
exists
())
{
if
(
callableMethod
!=
null
)
return
codegen
.
typeMapper
.
mapType
(
callableMethod
.
getReceiverClass
());
else
return
codegen
.
typeMapper
.
mapType
(
descriptor
.
getReceiverParameter
().
getType
());
}
else
{
return
Type
.
VOID_TYPE
;
}
}
}
@Override
public
void
put
(
Type
type
,
InstructionAdapter
v
)
{
CallableDescriptor
descriptor
=
resolvedCall
.
getResultingDescriptor
();
ReceiverDescriptor
thisObject
=
resolvedCall
.
getThisObject
();
ReceiverDescriptor
receiverArgument
=
resolvedCall
.
getReceiverArgument
();
if
(
thisObject
.
exists
())
{
if
(
receiverArgument
.
exists
())
{
codegen
.
generateFromResolvedCall
(
thisObject
,
codegen
.
typeMapper
.
mapType
(
descriptor
.
getExpectedThisObject
().
getType
()));
genReceiver
(
v
,
receiverArgument
,
type
,
descriptor
.
getReceiverParameter
());
}
else
{
genReceiver
(
v
,
thisObject
,
type
,
null
);
}
}
else
{
if
(
receiverArgument
.
exists
())
{
genReceiver
(
v
,
receiverArgument
,
type
,
descriptor
.
getReceiverParameter
());
}
}
}
private
void
genReceiver
(
InstructionAdapter
v
,
ReceiverDescriptor
receiverArgument
,
Type
type
,
ReceiverDescriptor
receiverParameter
)
{
if
(
receiver
==
StackValue
.
none
())
{
if
(
receiverParameter
!=
null
)
{
Type
receiverType
=
codegen
.
typeMapper
.
mapType
(
receiverParameter
.
getType
());
codegen
.
generateFromResolvedCall
(
receiverArgument
,
receiverType
);
StackValue
.
onStack
(
receiverType
).
put
(
type
,
v
);
}
else
{
codegen
.
generateFromResolvedCall
(
receiverArgument
,
type
);
}
}
else
{
receiver
.
put
(
type
,
v
);
}
}
}
}
compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/IntrinsicMethod.java
浏览文件 @
74fe24ef
package
org.jetbrains.jet.codegen.intrinsics
;
import
com.intellij.psi.PsiElement
;
import
org.jetbrains.annotations.Nullable
;
import
org.jetbrains.jet.codegen.Callable
;
import
org.jetbrains.jet.codegen.ExpressionCodegen
;
import
org.jetbrains.jet.codegen.StackValue
;
...
...
@@ -14,5 +15,5 @@ import java.util.List;
* @author yole
*/
public
interface
IntrinsicMethod
extends
Callable
{
StackValue
generate
(
ExpressionCodegen
codegen
,
InstructionAdapter
v
,
Type
expectedType
,
PsiElement
element
,
List
<
JetExpression
>
arguments
,
StackValue
receiver
);
StackValue
generate
(
ExpressionCodegen
codegen
,
InstructionAdapter
v
,
Type
expectedType
,
@Nullable
PsiElement
element
,
@Nullable
List
<
JetExpression
>
arguments
,
StackValue
receiver
);
}
compiler/backend/src/org/jetbrains/jet/compiler/CompileEnvironment.java
浏览文件 @
74fe24ef
...
...
@@ -113,7 +113,11 @@ public class CompileEnvironment {
}
if
((
rtJar
==
null
||
!
rtJar
.
exists
())
&&
failOnError
)
{
throw
new
CompileEnvironmentException
(
"No rt.jar found under JAVA_HOME="
+
javaHome
);
rtJar
=
findActiveRtJar
(
failOnError
);
if
((
rtJar
==
null
||
!
rtJar
.
exists
()))
{
throw
new
CompileEnvironmentException
(
"No rt.jar found under JAVA_HOME="
+
javaHome
);
}
}
return
rtJar
;
}
...
...
@@ -144,7 +148,7 @@ public class CompileEnvironment {
throw
new
CompileEnvironmentException
(
"Could not find rt.jar in system class loader: "
+
StringUtil
.
join
(
loader
.
getURLs
(),
new
Function
<
URL
,
String
>()
{
@Override
public
String
fun
(
URL
url
)
{
return
url
.
toString
();
return
url
.
toString
()
+
"\n"
;
}
},
", "
));
}
...
...
compiler/frontend/src/org/jetbrains/jet/lang/psi/JetPrefixExpression.java
浏览文件 @
74fe24ef
...
...
@@ -26,7 +26,7 @@ public class JetPrefixExpression extends JetUnaryExpression {
@Nullable
@IfNotParsed
public
JetExpression
getBaseExpression
()
{
PsiElement
expression
=
getOperationSign
().
getNextSibling
();
while
(
expression
!=
null
&&
false
==
expression
instanceof
JetExpression
)
{
while
(
expression
!=
null
&&
!(
expression
instanceof
JetExpression
)
)
{
expression
=
expression
.
getNextSibling
();
}
return
(
JetExpression
)
expression
;
...
...
compiler/tests/org/jetbrains/jet/codegen/ExtensionFunctionsTest.java
浏览文件 @
74fe24ef
...
...
@@ -21,6 +21,7 @@ public class ExtensionFunctionsTest extends CodegenTestCase {
public
void
testWhenFail
()
throws
Exception
{
loadFile
();
// System.out.println(generateToText());
Method
foo
=
generateFunction
(
"foo"
);
assertThrows
(
foo
,
Exception
.
class
,
null
,
new
StringBuilder
());
}
...
...
compiler/tests/org/jetbrains/jet/codegen/ObjectGenTest.java
浏览文件 @
74fe24ef
...
...
@@ -7,6 +7,7 @@ package org.jetbrains.jet.codegen;
public
class
ObjectGenTest
extends
CodegenTestCase
{
public
void
testSimpleObject
()
throws
Exception
{
blackBoxFile
(
"objects/simpleObject.jet"
);
// System.out.println(generateToText());
}
public
void
testObjectLiteral
()
throws
Exception
{
...
...
compiler/tests/org/jetbrains/jet/codegen/PropertyGenTest.java
浏览文件 @
74fe24ef
...
...
@@ -134,6 +134,7 @@ public class PropertyGenTest extends CodegenTestCase {
public
void
testKt257
()
throws
Exception
{
blackBoxFile
(
"regressions/kt257.jet"
);
// System.out.println(generateToText());
}
public
void
testKt613
()
throws
Exception
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录