JS: bound callable references (KT-13573).
This commit is contained in:
+35
-1
@@ -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";
|
||||
|
||||
Vendored
+2
-2
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user