pavone@266: { pavone@266: rt <- #{ pavone@266: llMessage: numMessages withVars: { pavone@266: intret <- obj_int32 ptr pavone@266: } andCode: { pavone@266: intret <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@266: intret num!: (sizeof: methodNames) / (sizeof: (char ptr)) pavone@266: intret pavone@266: } pavone@266: pavone@266: llMessage: methodName withVars: { pavone@266: methodId <- obj_int32 ptr pavone@266: name <- string ptr pavone@266: namelen <- int pavone@266: } andCode: :methodId { pavone@266: name <- make_object: (addr_of: string_meta) NULL 0 pavone@266: namelen <- strlen: (methodNames get: (methodId num)) pavone@266: name bytes!: namelen pavone@266: name len!: namelen pavone@266: name data!: (GC_MALLOC_ATOMIC: namelen + 1) pavone@266: memcpy: (name data) (methodNames get: (methodId num)) namelen pavone@266: name pavone@266: } pavone@266: pavone@266: llMessage: understands? withVars: { pavone@266: obj <- object ptr pavone@266: methodId <- obj_int32 ptr pavone@266: ret <- object ptr pavone@266: } andCode: :obj methodId { pavone@266: if: (object_understands: obj (methodId num)) { pavone@266: ret <- module_true pavone@266: } else: { pavone@266: ret <- module_false pavone@266: } pavone@266: ret pavone@266: } pavone@266: pavone@266: llMessage: addUnderstood withVars: { pavone@266: obj <- object ptr pavone@266: arr <- object ptr pavone@266: methHash <- (uint32_t ptr) ptr pavone@266: methodId <- obj_int32 ptr pavone@266: slot <- int pavone@266: i <- int pavone@266: } andCode: :obj arr { pavone@266: methHash <- (obj meta) methods pavone@266: slot <- 0 pavone@266: while: {slot < 16} do: { pavone@266: if: (methHash get: slot) { pavone@266: i <- 0 pavone@270: while: { ((methHash get: slot) get: i)!= 0xFFFFFFFF } do: { pavone@266: methodId <- make_object: (addr_of: obj_int32_meta) NULL 0 pavone@266: methodId num!: ((methHash get: slot) get: i) pavone@266: mcall: append 2 arr methodId pavone@266: pavone@266: i <- i + 1 pavone@266: } pavone@266: } pavone@266: pavone@266: slot <- slot + 1 pavone@266: } pavone@266: arr pavone@266: } pavone@268: pavone@268: llMessage: sendMessage:to withVars: { pavone@268: obj <- object ptr pavone@268: methodId <- obj_int32 ptr pavone@268: } andCode: :methodId :obj { pavone@268: mcall: (methodId num) 1 obj pavone@268: } pavone@266: } pavone@266: getMethodDict <- { pavone@266: methodDict <- dict hash pavone@266: i <- 0 pavone@266: n <- rt numMessages pavone@266: while: { i < n } do: { pavone@266: name <- rt methodName: i pavone@266: methodDict set: name i pavone@266: i <- i + 1 pavone@266: } pavone@266: getMethodDict <- { pavone@266: methodDict pavone@266: } pavone@266: methodDict pavone@266: } pavone@266: #{ pavone@266: does:understand? <- :obj :message { pavone@266: d <- getMethodDict: pavone@266: d ifget: message :messageId{ pavone@266: rt understands?: obj messageId pavone@266: } else: { false } pavone@266: } pavone@266: pavone@266: understoodBy <- :obj { pavone@266: ids <- rt addUnderstood: obj #[] pavone@266: ids map: :id { pavone@266: rt methodName: id pavone@266: } pavone@266: } pavone@268: pavone@270: propertiesOf <- :obj { pavone@270: messages <- understoodBy: obj pavone@270: setters <- dict hash pavone@270: potentials <- #[] pavone@270: foreach: messages :idx message { pavone@270: if: (message endsWith?: "!") { pavone@270: setters set: (message from: 0 withLength: (message length) - 1) true pavone@270: } else: { pavone@270: potentials append: message pavone@270: } pavone@270: } pavone@270: potentials filter: :el { setters contains?: el } pavone@270: } pavone@270: pavone@268: sendMessage:to <- :message :obj { pavone@268: d <- getMethodDict: pavone@268: d ifget: message :messageId{ pavone@268: rt sendMessage: messageId to: obj pavone@268: } else: { false } pavone@268: } pavone@266: } pavone@266: }