Quellcode durchsuchen

ncd: NCDObject: make it possible to have the method call context pointer different from the _getobj and _getarg context
pointers

ambrop7 vor 13 Jahren
Ursprung
Commit
d9d822788d
3 geänderte Dateien mit 44 neuen und 1 gelöschten Zeilen
  1. 3 1
      ncd/NCDInterpreter.c
  2. 37 0
      ncd/NCDObject.c
  3. 4 0
      ncd/NCDObject.h

+ 3 - 1
ncd/NCDInterpreter.c

@@ -930,7 +930,6 @@ void process_advance (struct process *p)
         if (!process_resolve_object_expr(p, p->ap, objnames, num_objnames, &object)) {
         if (!process_resolve_object_expr(p, p->ap, objnames, num_objnames, &object)) {
             goto fail0;
             goto fail0;
         }
         }
-        method_context = object.user;
         
         
         // get object type
         // get object type
         NCD_string_id_t object_type = NCDObject_Type(&object);
         NCD_string_id_t object_type = NCDObject_Type(&object);
@@ -939,6 +938,9 @@ void process_advance (struct process *p)
             goto fail0;
             goto fail0;
         }
         }
         
         
+        // get method context
+        method_context = NCDObject_MethodUser(&object);
+        
         // find module based on type of object
         // find module based on type of object
         module = NCDInterpProcess_StatementGetMethodModule(p->iprocess, p->ap, object_type, &p->interp->method_index);
         module = NCDInterpProcess_StatementGetMethodModule(p->iprocess, p->ap, object_type, &p->interp->method_index);
         
         

+ 37 - 0
ncd/NCDObject.c

@@ -37,6 +37,7 @@ NCDObject NCDObject_Build (NCD_string_id_t type, void *user, NCDObject_func_getv
 {
 {
     NCDObject obj;
     NCDObject obj;
     obj.type = type;
     obj.type = type;
+    obj.method_user = user;
     obj.user = user;
     obj.user = user;
     obj.user2 = NULL;
     obj.user2 = NULL;
     obj.uv.func_getvar = func_getvar;
     obj.uv.func_getvar = func_getvar;
@@ -51,6 +52,35 @@ NCDObject NCDObject_Build2 (NCD_string_id_t type, void *user, void *user2, NCDOb
     
     
     NCDObject obj;
     NCDObject obj;
     obj.type = type;
     obj.type = type;
+    obj.method_user = user;
+    obj.user = user;
+    obj.user2 = user2;
+    obj.uv.func_getvar2 = func_getvar2;
+    obj.uo.func_getobj2 = func_getobj2;
+    
+    return obj;
+}
+
+NCDObject NCDObject_BuildMethodUser (NCD_string_id_t type, void *method_user, void *user, NCDObject_func_getvar func_getvar, NCDObject_func_getobj func_getobj)
+{
+    NCDObject obj;
+    obj.type = type;
+    obj.method_user = method_user;
+    obj.user = user;
+    obj.user2 = NULL;
+    obj.uv.func_getvar = func_getvar;
+    obj.uo.func_getobj = func_getobj;
+    
+    return obj;
+}
+
+NCDObject NCDObject_BuildMethodUser2  (NCD_string_id_t type, void *method_user, void *user, void *user2, NCDObject_func_getvar2 func_getvar2, NCDObject_func_getobj2 func_getobj2)
+{
+    ASSERT(user2)
+    
+    NCDObject obj;
+    obj.type = type;
+    obj.method_user = method_user;
     obj.user = user;
     obj.user = user;
     obj.user2 = user2;
     obj.user2 = user2;
     obj.uv.func_getvar2 = func_getvar2;
     obj.uv.func_getvar2 = func_getvar2;
@@ -64,6 +94,13 @@ NCD_string_id_t NCDObject_Type (NCDObject *o)
     return o->type;
     return o->type;
 }
 }
 
 
+void * NCDObject_MethodUser (NCDObject *o)
+{
+    ASSERT(o->type >= 0)
+    
+    return o->method_user;
+}
+
 int NCDObject_GetObj (NCDObject *o, NCD_string_id_t name, NCDObject *out_object)
 int NCDObject_GetObj (NCDObject *o, NCD_string_id_t name, NCDObject *out_object)
 {
 {
     ASSERT(out_object)
     ASSERT(out_object)

+ 4 - 0
ncd/NCDObject.h

@@ -43,6 +43,7 @@ typedef int (*NCDObject_func_getobj2) (void *user, void *user2, NCD_string_id_t
 
 
 struct NCDObject_s {
 struct NCDObject_s {
     NCD_string_id_t type;
     NCD_string_id_t type;
+    void *method_user;
     void *user;
     void *user;
     void *user2;
     void *user2;
     union {
     union {
@@ -57,7 +58,10 @@ struct NCDObject_s {
 
 
 NCDObject NCDObject_Build (NCD_string_id_t type, void *user, NCDObject_func_getvar func_getvar, NCDObject_func_getobj func_getobj);
 NCDObject NCDObject_Build (NCD_string_id_t type, void *user, NCDObject_func_getvar func_getvar, NCDObject_func_getobj func_getobj);
 NCDObject NCDObject_Build2 (NCD_string_id_t type, void *user, void *user2, NCDObject_func_getvar2 func_getvar2, NCDObject_func_getobj2 func_getobj2);
 NCDObject NCDObject_Build2 (NCD_string_id_t type, void *user, void *user2, NCDObject_func_getvar2 func_getvar2, NCDObject_func_getobj2 func_getobj2);
+NCDObject NCDObject_BuildMethodUser (NCD_string_id_t type, void *method_user, void *user, NCDObject_func_getvar func_getvar, NCDObject_func_getobj func_getobj);
+NCDObject NCDObject_BuildMethodUser2  (NCD_string_id_t type, void *method_user, void *user, void *user2, NCDObject_func_getvar2 func_getvar2, NCDObject_func_getobj2 func_getobj2);
 NCD_string_id_t NCDObject_Type (NCDObject *o);
 NCD_string_id_t NCDObject_Type (NCDObject *o);
+void * NCDObject_MethodUser (NCDObject *o);
 int NCDObject_GetObj (NCDObject *o, NCD_string_id_t name, NCDObject *out_object) WARN_UNUSED;
 int NCDObject_GetObj (NCDObject *o, NCD_string_id_t name, NCDObject *out_object) WARN_UNUSED;
 int NCDObject_GetVar (NCDObject *o, NCD_string_id_t name, NCDValMem *mem, NCDValRef *out_value) WARN_UNUSED;
 int NCDObject_GetVar (NCDObject *o, NCD_string_id_t name, NCDValMem *mem, NCDValRef *out_value) WARN_UNUSED;
 int NCDObject_ResolveObjExprCompact (NCDObject *o, const NCD_string_id_t *names, size_t num_names, NCDObject *out_object) WARN_UNUSED;
 int NCDObject_ResolveObjExprCompact (NCDObject *o, const NCD_string_id_t *names, size_t num_names, NCDObject *out_object) WARN_UNUSED;