Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
硅谷海盗
kotlin
提交
446c4c0a
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,发现更多精彩内容 >>
提交
446c4c0a
编写于
9月 19, 2016
作者:
A
Alexey Andreev
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
JS: provide overflow behaviour for int binary operations (see KT-7733)
上级
24d5bdd6
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
73 addition
and
14 deletion
+73
-14
js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java
...etbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java
+6
-0
js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java
.../src/org/jetbrains/kotlin/js/translate/context/Namer.java
+4
-0
js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java
...nsic/functions/factories/PrimitiveBinaryOperationFIF.java
+29
-8
js/js.translator/testData/box/inline/callableReference.kt
js/js.translator/testData/box/inline/callableReference.kt
+1
-1
js/js.translator/testData/box/inline/inlineChain.kt
js/js.translator/testData/box/inline/inlineChain.kt
+1
-1
js/js.translator/testData/box/inline/inlineChainWithFewStatements.kt
...lator/testData/box/inline/inlineChainWithFewStatements.kt
+1
-1
js/js.translator/testData/box/inline/inlineInc.kt
js/js.translator/testData/box/inline/inlineInc.kt
+1
-1
js/js.translator/testData/box/inline/inlineLambdaWithCapture.kt
...translator/testData/box/inline/inlineLambdaWithCapture.kt
+1
-1
js/js.translator/testData/box/inlineSizeReduction/simpleReturnFunction.kt
.../testData/box/inlineSizeReduction/simpleReturnFunction.kt
+1
-1
js/js.translator/testData/box/number/intOverflow.kt
js/js.translator/testData/box/number/intOverflow.kt
+21
-0
js/js.translator/testData/kotlin_lib_ecma5.js
js/js.translator/testData/kotlin_lib_ecma5.js
+7
-0
未找到文件。
js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java
浏览文件 @
446c4c0a
...
...
@@ -5999,6 +5999,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
doTest
(
fileName
);
}
@TestMetadata
(
"intOverflow.kt"
)
public
void
testIntOverflow
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"js/js.translator/testData/box/number/intOverflow.kt"
);
doTest
(
fileName
);
}
@TestMetadata
(
"kt2342.kt"
)
public
void
testKt2342
()
throws
Exception
{
String
fileName
=
KotlinTestUtils
.
navigationMetadata
(
"js/js.translator/testData/box/number/kt2342.kt"
);
...
...
js/js.translator/src/org/jetbrains/kotlin/js/translate/context/Namer.java
浏览文件 @
446c4c0a
...
...
@@ -465,6 +465,10 @@ public final class Namer {
return
sb
.
toString
();
}
public
static
JsNameRef
imul
()
{
return
pureFqn
(
"imul"
,
kotlinObject
());
}
public
static
boolean
requiresEscaping
(
@NotNull
String
name
)
{
// TODO: remove if there is existing implementation of this method
// TODO: handle JavaScript keywords
...
...
js/js.translator/src/org/jetbrains/kotlin/js/translate/intrinsic/functions/factories/PrimitiveBinaryOperationFIF.java
浏览文件 @
446c4c0a
...
...
@@ -22,12 +22,14 @@ import com.google.common.collect.ImmutableMap;
import
com.google.dart.compiler.backend.js.ast.JsBinaryOperation
;
import
com.google.dart.compiler.backend.js.ast.JsBinaryOperator
;
import
com.google.dart.compiler.backend.js.ast.JsExpression
;
import
com.google.dart.compiler.backend.js.ast.JsInvocation
;
import
org.jetbrains.annotations.NotNull
;
import
org.jetbrains.annotations.Nullable
;
import
org.jetbrains.kotlin.builtins.KotlinBuiltIns
;
import
org.jetbrains.kotlin.descriptors.FunctionDescriptor
;
import
org.jetbrains.kotlin.js.patterns.DescriptorPredicate
;
import
org.jetbrains.kotlin.js.patterns.NamePredicate
;
import
org.jetbrains.kotlin.js.translate.context.Namer
;
import
org.jetbrains.kotlin.js.translate.context.TranslationContext
;
import
org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.FunctionIntrinsic
;
import
org.jetbrains.kotlin.js.translate.intrinsic.functions.basic.RangeToIntrinsic
;
...
...
@@ -61,13 +63,13 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
}
}
@NotNull
private
static
final
BinaryOperationIntrinsicBase
INTEGER_DIVISION_INTRINSIC
=
new
BinaryOperationIntrinsicBase
()
{
private
static
final
BinaryOperationIntrinsicBase
INT_MULTIPLICATION_INTRINSIC
=
new
BinaryOperationIntrinsicBase
()
{
@NotNull
@Override
public
JsExpression
doApply
(
@NotNull
JsExpression
left
,
@NotNull
JsExpression
right
,
@NotNull
TranslationContext
context
)
{
JsBinaryOperation
div
=
new
JsBinaryOperation
(
JsBinaryOperator
.
DIV
,
left
,
right
);
return
JsAstUtils
.
toInt32
(
div
);
public
JsExpression
doApply
(
@NotNull
JsExpression
left
,
@NotNull
JsExpression
right
,
@NotNull
TranslationContext
context
)
{
return
new
JsInvocation
(
Namer
.
imul
(),
left
,
right
);
}
};
...
...
@@ -91,6 +93,10 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
@NotNull
private
static
final
NamePredicate
BINARY_OPERATIONS
=
new
NamePredicate
(
OperatorNameConventions
.
BINARY_OPERATION_NAMES
);
private
static
final
DescriptorPredicate
INT_BINARY_OPERATIONS
=
pattern
(
"Int.plus|minus|div(Int)"
);
private
static
final
DescriptorPredicate
SIMPLE_INT_MULTIPLICATION
=
pattern
(
"Byte|Short.times(Byte|Short)"
);
private
static
final
DescriptorPredicate
INT_DIVISION
=
pattern
(
"Byte|Short|Int.div(Byte|Short|Int)"
);
private
static
final
DescriptorPredicate
PRIMITIVE_NUMBERS_BINARY_OPERATIONS
=
pattern
(
NamePredicate
.
PRIMITIVE_NUMBERS_MAPPED_TO_PRIMITIVE_JS
,
BINARY_OPERATIONS
);
...
...
@@ -102,6 +108,7 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
);
private
static
final
DescriptorPredicate
BOOLEAN_OPERATIONS
=
pattern
(
"Boolean.or|and|xor"
);
private
static
final
DescriptorPredicate
STRING_PLUS
=
pattern
(
"String.plus"
);
private
static
final
DescriptorPredicate
INT_MULTIPLICATION
=
pattern
(
"Int.times(Int)"
);
private
static
final
DescriptorPredicate
CHAR_RANGE_TO
=
pattern
(
"Char.rangeTo(Char)"
);
private
static
final
DescriptorPredicate
NUMBER_RANGE_TO
=
pattern
(
"Byte|Short|Int.rangeTo(Byte|Short|Int)"
);
...
...
@@ -139,9 +146,8 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
return
null
;
}
if
(
pattern
(
"Int|Short|Byte.div(Int|Short|Byte)"
).
apply
(
descriptor
))
{
return
INTEGER_DIVISION_INTRINSIC
;
if
(
INT_MULTIPLICATION
.
apply
(
descriptor
))
{
return
INT_MULTIPLICATION_INTRINSIC
;
}
if
(
NUMBER_RANGE_TO
.
apply
(
descriptor
))
{
return
new
RangeToIntrinsic
(
descriptor
);
...
...
@@ -153,6 +159,9 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
}
}
JsBinaryOperator
operator
=
getOperator
(
descriptor
);
if
(
INT_BINARY_OPERATIONS
.
apply
(
descriptor
)
||
SIMPLE_INT_MULTIPLICATION
.
apply
(
descriptor
)
||
INT_DIVISION
.
apply
(
descriptor
))
{
return
new
IntBinaryOperationFunctionIntrinsic
(
operator
);
}
BinaryOperationIntrinsicBase
result
=
new
PrimitiveBinaryOperationFunctionIntrinsic
(
operator
);
if
(
pattern
(
"Char.plus|minus(Int)"
).
apply
(
descriptor
))
{
...
...
@@ -196,6 +205,18 @@ public enum PrimitiveBinaryOperationFIF implements FunctionIntrinsicFactory {
}
}
private
static
class
IntBinaryOperationFunctionIntrinsic
extends
PrimitiveBinaryOperationFunctionIntrinsic
{
private
IntBinaryOperationFunctionIntrinsic
(
@NotNull
JsBinaryOperator
operator
)
{
super
(
operator
);
}
@NotNull
@Override
public
JsExpression
doApply
(
@NotNull
JsExpression
left
,
@NotNull
JsExpression
right
,
@NotNull
TranslationContext
context
)
{
return
JsAstUtils
.
toInt32
(
super
.
doApply
(
left
,
right
,
context
));
}
}
private
static
class
CharAndIntBinaryOperationFunctionIntrinsic
extends
BinaryOperationIntrinsicBase
{
@NotNull
...
...
js/js.translator/testData/box/inline/callableReference.kt
浏览文件 @
446c4c0a
package
foo
// CHECK_CONTAINS_NO_CALLS: multiplyInline
// CHECK_CONTAINS_NO_CALLS: multiplyInline
except=imul
// CHECK_NOT_CALLED: runNoinline
internal
inline
fun
multiply
(
a
:
Int
,
b
:
Int
)
=
a
*
b
...
...
js/js.translator/testData/box/inline/inlineChain.kt
浏览文件 @
446c4c0a
package
foo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo
except=imul
internal
inline
fun
inline1
(
a
:
Int
):
Int
{
return
a
...
...
js/js.translator/testData/box/inline/inlineChainWithFewStatements.kt
浏览文件 @
446c4c0a
package
foo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo
// CHECK_CONTAINS_NO_CALLS: squareMultipliedByTwo
except=imul
internal
inline
fun
inline1
(
a
:
Int
):
Int
{
return
a
...
...
js/js.translator/testData/box/inline/inlineInc.kt
浏览文件 @
446c4c0a
package
foo
// CHECK_CONTAINS_NO_CALLS: multiplyNoInline
// CHECK_CONTAINS_NO_CALLS: multiplyNoInline
except=imul
internal
inline
fun
multiply
(
a
:
Int
,
b
:
Int
):
Int
{
return
a
*
b
...
...
js/js.translator/testData/box/inline/inlineLambdaWithCapture.kt
浏览文件 @
446c4c0a
package
foo
// CHECK_CONTAINS_NO_CALLS: maxBySquare
// CHECK_CONTAINS_NO_CALLS: maxBySquare
except=imul
internal
data class
Result
(
var
value
:
Int
=
0
,
var
invocationCount
:
Int
=
0
)
...
...
js/js.translator/testData/box/inlineSizeReduction/simpleReturnFunction.kt
浏览文件 @
446c4c0a
package
foo
// CHECK_CONTAINS_NO_CALLS: test
// CHECK_CONTAINS_NO_CALLS: test
except=imul
// CHECK_VARS_COUNT: function=test count=0
// A copy of stdlib run function.
...
...
js/js.translator/testData/box/number/intOverflow.kt
0 → 100644
浏览文件 @
446c4c0a
package
foo
fun
bigValue
()
=
0x7FFFFFFC
fun
mediumValue
()
=
0x12345
fun
box
():
String
{
var
v
=
bigValue
()
+
1
if
(
v
!=
0x7FFFFFFD
)
return
"fail1: $v"
v
=
bigValue
()
+
8
if
(
v
!=
-
0x7FFFFFFC
)
return
"fail2: $v"
v
=
mediumValue
()
*
0x23456
if
(
v
!=
-
2112496338
)
return
"fail3: $v"
v
=
bigValue
()
*
bigValue
()
if
(
v
!=
16
)
return
"fail4: $v"
return
"OK"
}
\ No newline at end of file
js/js.translator/testData/kotlin_lib_ecma5.js
浏览文件 @
446c4c0a
...
...
@@ -313,4 +313,11 @@
Kotlin
.
kotlinModuleMetadata
=
function
(
abiVersion
,
moduleName
,
data
)
{
};
Kotlin
.
imul
=
Math
.
imul
||
function
(
a
,
b
)
{
var
ah
=
(
a
>>>
16
)
&
0xffff
;
var
al
=
a
&
0xffff
;
var
bh
=
(
b
>>>
16
)
&
0xffff
;
var
bl
=
b
&
0xffff
;
return
((
al
*
bl
)
+
(((
ah
*
bl
+
al
*
bh
)
<<
16
)
>>>
0
)
|
0
);
};
})();
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录