ObjInstanceClass optimization

This commit is contained in:
Sergey Chernov 2025-06-10 23:14:44 +04:00
parent 652e1d3af4
commit 88b355c40d
3 changed files with 11 additions and 11 deletions

View File

@ -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")

View File

@ -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 {

View File

@ -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)