JS: generate a function with the required name for callable references instead try to change the name later. The previous solution doesn't work properly on some JS VMs (e.g. in FireFox)

#KT-12929 Fixed
This commit is contained in:
Zalim Bashorov
2016-07-01 15:48:20 +03:00
parent 919c099a95
commit 48617caacc
+7 -8
View File
@@ -417,23 +417,23 @@
};
Kotlin.getCallableRefForTopLevelProperty = function(packageName, name, isVar) {
var getFun = function() { return packageName[name]; };
var getFun = Function("p", "return function " + name + "() { return p['" + name + "']; }")(packageName);
var setFun = isVar ? function(value) { packageName[name] = value; } : null;
return getPropertyRefClass(name, getFun, "get", setFun, "set_za3rmp$", propertyRefClassMetadataCache.zeroArg);
return getPropertyRefClass(getFun, "get", setFun, "set_za3rmp$", propertyRefClassMetadataCache.zeroArg);
};
Kotlin.getCallableRefForMemberProperty = function(name, isVar) {
var getFun = function(receiver) { return receiver[name]; };
var getFun = Function("return function " + name + "(receiver) { return receiver['" + name + "']; }")();
var setFun = isVar ? function(receiver, value) { receiver[name] = value; } : null;
return getPropertyRefClass(name, getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
return getPropertyRefClass(getFun, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
};
Kotlin.getCallableRefForExtensionProperty = function(name, getFun, setFun) {
var getFunWrapper = function(receiver, extensionReceiver) { return getFun(receiver, extensionReceiver) };
return getPropertyRefClass(name, getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
var getFunWrapper = Function("getFun", "return function " + name + "(receiver, extensionReceiver) { return getFun(receiver, extensionReceiver) }")(getFun);
return getPropertyRefClass(getFunWrapper, "get_za3rmp$", setFun, "set_wn2jw4$", propertyRefClassMetadataCache.oneArg);
};
function getPropertyRefClass(name, getFun, getName, setFun, setName, cache) {
function getPropertyRefClass(getFun, getName, setFun, setName, cache) {
var obj = getFun;
var isMutable = typeof setFun === "function";
obj.$metadata$ = getPropertyRefMetadata(isMutable ? cache.mutable : cache.immutable);
@@ -442,7 +442,6 @@
obj[setName] = setFun;
}
obj.constructor = obj;
Object.defineProperty(obj, "name", { get : function() { return name; } });
return obj;
}