ObjInstanceClass optimization
This commit is contained in:
		
							parent
							
								
									652e1d3af4
								
							
						
					
					
						commit
						88b355c40d
					
				@ -769,12 +769,12 @@ class Compiler(
 | 
			
		||||
            for ((name, record) in objects) {
 | 
			
		||||
                when (record.visibility) {
 | 
			
		||||
                    Visibility.Public -> {
 | 
			
		||||
                        thisObj.publicFields += name
 | 
			
		||||
                        thisObj.protectedFields += name
 | 
			
		||||
                        thisObj.objClass.publicFields += name
 | 
			
		||||
                        thisObj.objClass.protectedFields += name
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                    Visibility.Protected ->
 | 
			
		||||
                        thisObj.protectedFields += name
 | 
			
		||||
                        thisObj.objClass.protectedFields += name
 | 
			
		||||
 | 
			
		||||
                    Visibility.Private -> {
 | 
			
		||||
                        //println("private field: $name")
 | 
			
		||||
 | 
			
		||||
@ -7,6 +7,9 @@ class ObjClass(
 | 
			
		||||
    vararg val parents: ObjClass,
 | 
			
		||||
) : Obj() {
 | 
			
		||||
 | 
			
		||||
    internal val publicFields = mutableSetOf<String>()
 | 
			
		||||
    internal val protectedFields = mutableSetOf<String>()
 | 
			
		||||
 | 
			
		||||
    var instanceConstructor: Statement? = null
 | 
			
		||||
 | 
			
		||||
    val allParentsSet: Set<ObjClass> = parents.flatMap {
 | 
			
		||||
 | 
			
		||||
@ -2,18 +2,15 @@ package net.sergeych.lyng
 | 
			
		||||
 | 
			
		||||
class ObjInstance(override val objClass: ObjClass) : Obj() {
 | 
			
		||||
 | 
			
		||||
    internal val publicFields = mutableSetOf<String>()
 | 
			
		||||
    internal val protectedFields = mutableSetOf<String>()
 | 
			
		||||
 | 
			
		||||
    internal lateinit var instanceContext: Context
 | 
			
		||||
 | 
			
		||||
    override suspend fun readField(context: Context, name: String): ObjRecord {
 | 
			
		||||
        return if( name in publicFields ) instanceContext[name]!!
 | 
			
		||||
        return if( name in objClass.publicFields ) instanceContext[name]!!
 | 
			
		||||
        else super.readField(context, name)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun writeField(context: Context, name: String, newValue: Obj) {
 | 
			
		||||
        if( name in publicFields ) {
 | 
			
		||||
        if( name in objClass.publicFields ) {
 | 
			
		||||
            val f = instanceContext[name]!!
 | 
			
		||||
            if( !f.isMutable ) ObjIllegalAssignmentError(context, "can't reassign val $name").raise()
 | 
			
		||||
            if( f.value.assign(context, newValue) == null)
 | 
			
		||||
@ -23,12 +20,12 @@ class ObjInstance(override val objClass: ObjClass) : Obj() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override suspend fun invokeInstanceMethod(context: Context, name: String, args: Arguments): Obj {
 | 
			
		||||
        if( name in publicFields ) return instanceContext[name]!!.value.invoke(context, this, args)
 | 
			
		||||
        if( name in objClass.publicFields ) return instanceContext[name]!!.value.invoke(context, this, args)
 | 
			
		||||
        return super.invokeInstanceMethod(context, name, args)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    override fun toString(): String {
 | 
			
		||||
        val fields = publicFields.map {
 | 
			
		||||
        val fields = objClass.publicFields.map {
 | 
			
		||||
                instanceContext[it]?.value?.toString() ?: "??"
 | 
			
		||||
        }.joinToString(", ")
 | 
			
		||||
        return "${objClass.className}($fields)"
 | 
			
		||||
@ -37,7 +34,7 @@ class ObjInstance(override val objClass: ObjClass) : Obj() {
 | 
			
		||||
    override suspend fun compareTo(context: Context, other: Obj): Int {
 | 
			
		||||
        if( other !is ObjInstance ) return -1
 | 
			
		||||
        if( other.objClass != objClass ) return -1
 | 
			
		||||
        for( f in publicFields ) {
 | 
			
		||||
        for( f in objClass.publicFields ) {
 | 
			
		||||
            val a = instanceContext[f]!!.value
 | 
			
		||||
            val b = other.instanceContext[f]!!.value
 | 
			
		||||
            val d = a.compareTo(context, b)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user