KJS: trait -> interface

This commit is contained in:
Zalim Bashorov
2016-12-27 00:21:51 +03:00
parent c6f0d0fa59
commit be694d53ef
2 changed files with 12 additions and 20 deletions
+11 -19
View File
@@ -16,9 +16,8 @@
Kotlin.TYPE = { Kotlin.TYPE = {
CLASS: "class", CLASS: "class",
TRAIT: "trait", INTERFACE: "interface",
OBJECT: "object", OBJECT: "object"
INIT_FUN: "init fun"
}; };
Kotlin.classCount = 0; Kotlin.classCount = 0;
@@ -28,10 +27,6 @@ Kotlin.newClassIndex = function () {
return tmp; return tmp;
}; };
function isNativeClass(obj) {
return !(obj == null) && obj.$metadata$ == null;
}
Kotlin.callGetter = function (thisObject, klass, propertyName) { Kotlin.callGetter = function (thisObject, klass, propertyName) {
var propertyDescriptor = Object.getOwnPropertyDescriptor(klass, propertyName); var propertyDescriptor = Object.getOwnPropertyDescriptor(klass, propertyName);
if (propertyDescriptor != null) { if (propertyDescriptor != null) {
@@ -64,20 +59,20 @@ Kotlin.callSetter = function (thisObject, klass, propertyName, value) {
} }
}; };
function isInheritanceFromTrait(metadata, trait) { function isInheritanceFromInterface(metadata, iface) {
// TODO: return this optimization // TODO: return this optimization
/*if (metadata == null || metadata.classIndex < trait.$metadata$.classIndex) { /*if (metadata == null || metadata.classIndex < iface.$metadata$.classIndex) {
return false; return false;
}*/ }*/
var baseClasses = metadata.baseClasses; var baseClasses = metadata.baseClasses;
var i; var i;
for (i = 0; i < baseClasses.length; i++) { for (i = 0; i < baseClasses.length; i++) {
if (baseClasses[i] === trait) { if (baseClasses[i] === iface) {
return true; return true;
} }
} }
for (i = 0; i < baseClasses.length; i++) { for (i = 0; i < baseClasses.length; i++) {
if (isInheritanceFromTrait(baseClasses[i].$metadata$, trait)) { if (isInheritanceFromInterface(baseClasses[i].$metadata$, iface)) {
return true; return true;
} }
} }
@@ -120,26 +115,23 @@ Kotlin.isType = function (object, klass) {
} }
} }
var klassMetadata = klass.$metadata$;
// In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof // In WebKit (JavaScriptCore) for some interfaces from DOM typeof returns "object", nevertheless they can be used in RHS of instanceof
if (isNativeClass(klass)) { if (klassMetadata == null) {
return object instanceof klass; return object instanceof klass;
} }
if (isTrait(klass) && object.constructor != null) { if (klassMetadata.type === Kotlin.TYPE.INTERFACE && object.constructor != null) {
metadata = object.constructor.$metadata$; metadata = object.constructor.$metadata$;
if (metadata != null) { if (metadata != null) {
return isInheritanceFromTrait(metadata, klass); return isInheritanceFromInterface(metadata, klass);
} }
} }
return false; return false;
}; };
function isTrait(klass) {
var metadata = klass.$metadata$;
return metadata != null && metadata.type === Kotlin.TYPE.TRAIT;
}
Kotlin.isNumber = function (a) { Kotlin.isNumber = function (a) {
return typeof a == "number" || a instanceof Kotlin.Long; return typeof a == "number" || a instanceof Kotlin.Long;
}; };
@@ -173,7 +173,7 @@ class ClassTranslator private constructor(
private fun addMetadataType() { private fun addMetadataType() {
val kotlinType = JsNameRef("TYPE", Namer.KOTLIN_NAME) val kotlinType = JsNameRef("TYPE", Namer.KOTLIN_NAME)
val typeRef = when { val typeRef = when {
DescriptorUtils.isInterface(descriptor) -> JsNameRef("TRAIT", kotlinType) DescriptorUtils.isInterface(descriptor) -> JsNameRef("INTERFACE", kotlinType)
DescriptorUtils.isObject(descriptor) -> JsNameRef("OBJECT", kotlinType) DescriptorUtils.isObject(descriptor) -> JsNameRef("OBJECT", kotlinType)
else -> JsNameRef("CLASS", kotlinType) else -> JsNameRef("CLASS", kotlinType)
} }