JS: bound callable references (KT-13573).

This commit is contained in:
Anton Bannykh
2016-11-22 16:44:10 +03:00
parent dc1e3ae441
commit 159df7964a
28 changed files with 474 additions and 121 deletions
+35 -1
View File
@@ -142,7 +142,7 @@
}
// TODO Store callable references for members in class
Kotlin.getCallableRefForMemberFunction = function (klass, memberName) {
Kotlin.getCallableRefForMemberFunction = function (memberName) {
return function () {
var args = [].slice.call(arguments);
var instance = args.shift();
@@ -150,6 +150,12 @@
};
};
Kotlin.getBoundCallableRefForMemberFunction = function (receiver, memberName) {
return function () {
return receiver[memberName].apply(receiver, arguments);
};
};
// TODO Store callable references for extension functions in class
// extFun expected receiver as the first argument
Kotlin.getCallableRefForExtensionFunction = function (extFun) {
@@ -158,6 +164,14 @@
};
};
Kotlin.getBoundCallableRefForExtensionFunction = function (receiver, extFun) {
return function () {
var args = [].slice.call(arguments);
args.unshift(receiver);
return extFun.apply(null, args);
};
};
Kotlin.getCallableRefForLocalExtensionFunction = function (extFun) {
return function () {
var args = [].slice.call(arguments);
@@ -166,6 +180,12 @@
};
};
Kotlin.getBoundCallableRefForLocalExtensionFunction = function (receiver, extFun) {
return function () {
return extFun.apply(receiver, arguments);
};
};
Kotlin.getCallableRefForConstructor = function (klass) {
return function () {
var obj = Object.create(klass.prototype);
@@ -185,11 +205,25 @@
return getPropertyRefClass(getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
};
Kotlin.getBoundCallableRefForMemberProperty = function(receiver, name, isVar) {
var getFun = Function("receiver", "return function " + name + "() { return receiver['" + name + "']; }")(receiver);
var setFun = isVar ? function(value) { receiver[name] = value; } : null;
return getPropertyRefClass(getFun, "get", setFun, "set_za3rmp$", propertyRefClassMetadataCache.oneArg);
};
Kotlin.getCallableRefForExtensionProperty = function(name, getFun, setFun) {
var getFunWrapper = Function("getFun", "return function " + name + "(receiver, extensionReceiver) { return getFun(receiver, extensionReceiver) }")(getFun);
return getPropertyRefClass(getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
};
Kotlin.getBoundCallableRefForExtensionProperty = function(receiver, name, getFun, setFun) {
var getFunWrapper = Function("receiver", "getFun", "return function " + name + "(extensionReceiver) { return getFun(receiver, extensionReceiver) }")(receiver, getFun);
if (setFun) {
setFun = setFun.bind(null, receiver);
}
return getPropertyRefClass(getFunWrapper, "get", setFun, "set_za3rmp$", propertyRefClassMetadataCache.oneArg);
};
function getPropertyRefClass(getFun, getName, setFun, setName, cache) {
var obj = getFun;
var isMutable = typeof setFun === "function";
+2 -2
View File
@@ -2,10 +2,10 @@
<html>
<head>
<script type="application/javascript" src="../../../dist/js/kotlin.js"></script>
<script type="application/javascript" src="out/box/native/eval_v5.js"></script>
<script type="application/javascript" src="out/codegen/boxInline/callableReference/bound/topLevelExtensionProperty_v5.js"></script>
<script type="application/javascript">
console.log(JS_TESTS.foo.box());
console.log(JS_TESTS.box());
</script>
</head>
<body>