From owner-acpi-jp@jp.freebsd.org  Sun Jan 23 18:14:28 2000
Received: (from daemon@localhost)
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) id SAA33919;
	Sun, 23 Jan 2000 18:14:28 +0900 (JST)
	(envelope-from owner-acpi-jp@jp.FreeBSD.org)
Received: from tasogare.imasy.or.jp (daemon@tasogare.imasy.or.jp [202.227.24.5])
	by castle.jp.freebsd.org (8.9.3+3.2W/8.7.3) with ESMTP id SAA33913
	for <acpi-jp@jp.freebsd.org>; Sun, 23 Jan 2000 18:14:27 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Received: from localhost (isdn50.imasy.or.jp [202.227.24.242])
	by tasogare.imasy.or.jp (8.9.3+3.2W/3.7W-tasogare/smtpfeed 1.01) with ESMTP id SAA13267
	for <acpi-jp@jp.freebsd.org>; Sun, 23 Jan 2000 18:14:21 +0900 (JST)
	(envelope-from iwasaki@jp.FreeBSD.org)
Message-Id: <200001230914.SAA13267@tasogare.imasy.or.jp>
To: acpi-jp@jp.freebsd.org
In-Reply-To: Your message of "Sun, 23 Jan 2000 04:44:20 +0900"
	<200001221944.EAA15656@tasogare.imasy.or.jp>
References: <200001221944.EAA15656@tasogare.imasy.or.jp>
X-Mailer: Mew version 1.93 on Emacs 19.34 / Mule 2.3 (SUETSUMUHANA)
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
Date: Sun, 23 Jan 2000 18:14:20 +0900
From: Mitsuru IWASAKI <iwasaki@jp.freebsd.org>
X-Dispatcher: imput version 980905(IM100)
Lines: 375
Reply-To: acpi-jp@jp.freebsd.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+990727
X-Sequence: acpi-jp 240
Subject: [acpi-jp 240] Re: RefOfOp Problem.
Errors-To: owner-acpi-jp@jp.freebsd.org
Sender: owner-acpi-jp@jp.freebsd.org
X-Originator: iwasaki@jp.freebsd.org

> $BN;2r!#BgBND>$;$=$&$G$9$1$I!"(Bobjref $B$r2rJ|$9$k%?%$%_%s%0$,Fq$7$$$G$9$M!#(B
> $B:#$^$G$O(B Store() $B$J$I$G;H$$=*$o$C$?$iGK4~$7$F$$$?$1$I!"(BArgX $B$GM?$($i$l$k(B
> objref $B$O(B Method $B<B9T=*$o$k$^$GBT$C$F$"$2$k(B?

$B$D!<$+!"(Bobjref $B$J$I$N;H$$<N$F$N%*%V%8%'%/%H$O(B Method $B<B9TC10L$G(B
$B$^$H$a$FGK4~$9$k$N$,$$$$$H$$$&7kO@$KC#$7$^$7$?!#(B
$B$H$$$&$o$1$G!"$3$s$J46$8$G$$$+$,(B?

Index: amlmem.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/amlmem.c,v
retrieving revision 1.3
diff -u -r1.3 amlmem.c
--- amlmem.c	2000/01/11 11:33:41	1.3
+++ amlmem.c	2000/01/23 08:45:53
@@ -51,6 +51,7 @@
 MEMMAN_INITIALSTORAGE_DESC(struct aml_name, _aml_name_storage);
 MEMMAN_INITIALSTORAGE_DESC(struct aml_nameptr, _aml_nameptr_storage);
 MEMMAN_INITIALSTORAGE_DESC(struct aml_objref, _aml_objref_storage);
+MEMMAN_INITIALSTORAGE_DESC(struct aml_objectptr, _aml_objectptr_storage);
 
 memman_blockman_t aml_blockman[] = {
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_namestr), _aml_namestr_storage),
@@ -69,11 +70,12 @@
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_name), _aml_name_storage),
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_nameptr), _aml_nameptr_storage),
 	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_objref), _aml_objref_storage),
+	MEMMAN_MEMBLOCK_DESC(sizeof(struct aml_objectptr), _aml_objectptr_storage),
 };
 
 memman_histogram_t aml_histogram[MEMMAN_HISTOGRAM_SIZE];
 
-static memman_t _aml_memman = MEMMAN_MEMMANAGER_DESC(aml_blockman, 16,
+static memman_t _aml_memman = MEMMAN_MEMMANAGER_DESC(aml_blockman, 17,
 						     aml_histogram, 1);
 
 memman_t *aml_memman = &_aml_memman;
Index: amlmem.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/amlmem.h,v
retrieving revision 1.2
diff -u -r1.2 amlmem.h
--- amlmem.h	2000/01/11 11:33:41	1.2
+++ amlmem.h	2000/01/23 08:46:19
@@ -51,6 +51,7 @@
 	memid_aml_name,
 	memid_aml_nameptr,
 	memid_aml_objref,
+	memid_aml_objectptr,
 };
 
 extern memman_t	*aml_memman;
Index: debug.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/debug.c,v
retrieving revision 1.6
diff -u -r1.6 debug.c
--- debug.c	2000/01/12 18:45:13	1.6
+++ debug.c	2000/01/23 08:44:21
@@ -434,7 +434,7 @@
 			printf(" (offset %d)", obj->objref.offset);
 		}
 		printf(" of ");
-		showobject(obj->objref.ref);
+		showobject(*(obj->objref.ref));
 		break;
 	default:
 		printf("UNK ID=%d\n", obj->type);
Index: env.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/env.h,v
retrieving revision 1.3
diff -u -r1.3 env.h
--- env.h	2000/01/11 11:33:41	1.3
+++ env.h	2000/01/23 08:44:21
@@ -39,5 +39,6 @@
 	 struct aml_name_list created_on_exec;
 	 unsigned	executing;
 	 unsigned	work_needfree;
+	 struct aml_object_list temporary_objects;
        };
 
Index: evalobj.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/evalobj.c,v
retrieving revision 1.7
diff -u -r1.7 evalobj.c
--- evalobj.c	2000/01/12 18:45:13	1.7
+++ evalobj.c	2000/01/23 09:07:24
@@ -141,6 +141,7 @@
 	{
 		int	offset;
 		union aml_object num1;
+		union aml_object *ref;
 
 		if (aname->property != &env->wobj) {
 			acpi_free_objectcontent(&env->wobj);
@@ -149,11 +150,16 @@
 			ret = obj = aname->property;
 			num1.type = aml_t_num;
 			offset = obj->objref.offset;
+			ref = *(obj->objref.ref);
+			if (ref == NULL) {
+				aname->property = ret;
+				return aname->property;
+			}
 
-			switch (obj->objref.ref->type) {
+			switch (ref->type) {
 			case aml_t_package:
-				if (obj->objref.ref->package.elements > offset) {
-					ret = obj->objref.ref->package.objects[offset];
+				if (ref->package.elements > offset) {
+					ret = ref->package.objects[offset];
 					if (obj != &env->wobj) {
 						acpi_free_object(&obj);
 					}
@@ -167,8 +173,8 @@
 				}
 				break;
 			case aml_t_buffer:
-				if (obj->objref.ref->buffer.size > offset) {
-					num1.num.number = obj->objref.ref->buffer.data[offset] & 0xff;
+				if (ref->buffer.size > offset) {
+					num1.num.number = ref->buffer.data[offset] & 0xff;
 				} else {
 					num1.num.number = 0;
 				}
@@ -284,6 +290,7 @@
 	struct aml_name *name;
 	struct aml_nameptr *created;
 	struct aml_environ orgenv;
+	struct aml_objectptr *objptr;
 	
 #if 1
 	orgenv.executing = env->executing;
@@ -291,6 +298,9 @@
 	    sizeof env->created_on_exec);
 	TAILQ_INIT(&env->created_on_exec);
 	env->executing = 1;
+	memcpy(&orgenv.temporary_objects, &env->temporary_objects,
+	    sizeof env->temporary_objects);
+	TAILQ_INIT(&env->temporary_objects);
 #endif
 	DPRINT("[");
 	acpi_print_curname(env->curname);
@@ -305,7 +315,7 @@
 	env->work_needfree = 0;
 	while (!TAILQ_EMPTY(&env->created_on_exec)) {
 		created = TAILQ_FIRST(&env->created_on_exec);
-		if (name->property == created->name->property) {
+		if (name != NULL && name->property == created->name->property) {
 			name = &env->work;
 			name->property = acpi_copy_object(env, created->name->property);
 			env->work_needfree = 1;
@@ -316,9 +326,22 @@
 	}
 	TAILQ_INIT(&env->created_on_exec);
 
+	while (!TAILQ_EMPTY(&env->temporary_objects)) {
+		objptr = TAILQ_FIRST(&env->temporary_objects);
+		TAILQ_REMOVE(&env->temporary_objects, objptr, links);
+		if (objptr->object != NULL &&
+		    objptr->object->type != aml_t_null) {
+			acpi_free_object(&objptr->object);
+		}
+		memman_free(aml_memman, memid_aml_objectptr, objptr);
+	}
+	TAILQ_INIT(&env->temporary_objects);
+
 	memcpy(&env->created_on_exec, &orgenv.created_on_exec,
 	    sizeof env->created_on_exec);
 	env->executing = orgenv.executing;
+	memcpy(&env->temporary_objects, &orgenv.temporary_objects,
+	    sizeof env->temporary_objects);
 #endif
 	return name;
 }
Index: obj.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/obj.c,v
retrieving revision 1.3
diff -u -r1.3 obj.c
--- obj.c	2000/01/11 11:33:41	1.3
+++ obj.c	2000/01/23 08:44:22
@@ -224,3 +224,23 @@
 	}
 }
 
+void
+acpi_register_temporary_object(struct aml_environ *env, union aml_object *obj)
+{
+	struct aml_objectptr *objptr;
+
+	TAILQ_FOREACH(objptr, &env->temporary_objects, links) {
+		if (objptr->object == obj) {
+			return;
+		}
+	}
+
+	objptr = memman_alloc(aml_memman, memid_aml_objectptr);
+	if (objptr == NULL) {
+		printf("acpi_register_temporary_object: memory alloc failed for objptr\n");
+		return;
+	}
+	objptr->object = obj;
+	TAILQ_INSERT_HEAD(&env->temporary_objects, objptr, links);
+}
+
Index: obj.h
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/obj.h,v
retrieving revision 1.4
diff -u -r1.4 obj.h
--- obj.h	2000/01/11 11:33:41	1.4
+++ obj.h	2000/01/23 08:44:22
@@ -27,6 +27,8 @@
  */
 #ifndef _OBJ_H_
 #define _OBJ_H_
+
+#include <sys/queue.h>
 struct aml_environ;
 enum aml_objtype {
 	aml_t_namestr = -2,
@@ -144,7 +146,7 @@
 };
 struct aml_objref {
 	enum aml_objtype type;
-	union aml_object *ref;
+	union aml_object **ref;
 	int             offset;	/* of aml_buffer.data or aml_package.objects. */
 	/* if negative value, not ready to dereference for element access. */
 	unsigned	deref;	/* indicates whether dereffenced or not */
@@ -166,6 +168,12 @@
 	struct aml_objref objref;
 };
 
+struct aml_objectptr {
+        TAILQ_ENTRY(aml_objectptr)        links;
+        union aml_object *object;
+};
+TAILQ_HEAD(aml_object_list, aml_objectptr);
+
 
 union aml_object * acpi_copy_object(struct aml_environ *env,union aml_object *orig);
 union aml_object * acpi_alloc_object(enum aml_objtype type, union aml_object * orig);
@@ -173,4 +181,5 @@
 void
 acpi_free_object(union aml_object ** obj);
 void acpi_realloc_object(union aml_object * obj, int size);
+void acpi_register_temporary_object(struct aml_environ *env,union aml_object *obj);
 #endif
Index: parse.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/parse.c,v
retrieving revision 1.15
diff -u -r1.15 parse.c
--- parse.c	2000/01/11 11:33:41	1.15
+++ parse.c	2000/01/23 08:44:22
@@ -1260,14 +1260,16 @@
 
 	case 0x71:		/* RefOfOp */
 	{
-		union aml_object *srcobj, *objref;
+		struct aml_name *src;
+		union aml_object *objref;
 
 		DPRINT("RefOf(");
-		srcobj = acpi_eval_name(env, acpi_parse_termobj(env, indent));
+		src = acpi_parse_termobj(env, indent);
 		DPRINT(")");
 
 		objref = acpi_alloc_object(aml_t_objref, NULL);
-		objref->objref.ref = srcobj;
+		acpi_register_temporary_object(env, objref);
+		objref->objref.ref = &src->property;
 		objref->objref.offset = -1;	/* deferent from IndexOp */
 		objref->objref.deref = 0;
 		env->work.property = objref;
@@ -1392,12 +1394,18 @@
 		DPRINT("DerefOf(");
 		objref = acpi_eval_name(env, acpi_parse_termobj(env, indent));
 		DPRINT(")");
+
+		if ((*(objref->objref.ref)) == NULL) {
+			env->work.property = *(objref->objref.ref);
+			aname = &env->work;
+			break;
+		}
 
-		switch (objref->objref.ref->type) {
+		switch ((*(objref->objref.ref))->type) {
 		case aml_t_package:
 		case aml_t_buffer:
 			if (objref->objref.offset < 0) {
-				env->work.property = objref->objref.ref;
+				env->work.property = *(objref->objref.ref);
 				if (objref != &env->wobj) {
 					acpi_free_object(&objref);
 				}
@@ -1407,10 +1415,7 @@
 			}
 			break;
 		default:
-			env->work.property = objref->objref.ref;
-			if (objref != &env->wobj) {
-				acpi_free_object(&objref);
-			}
+			env->work.property = *(objref->objref.ref);
 			break;
 		}
 
@@ -1472,7 +1477,8 @@
 		case aml_t_package:
 		case aml_t_buffer:
 			objref = acpi_alloc_object(aml_t_objref, NULL);
-			objref->objref.ref = srcobj;
+			acpi_register_temporary_object(env, objref);
+			objref->objref.ref = &srcobj;
 			objref->objref.offset = num1;
 			objref->objref.deref = 0;
 			break;
Index: store.c
===================================================================
RCS file: /home/cvs/ACPI/util/acpiconf/store.c,v
retrieving revision 1.5
diff -u -r1.5 store.c
--- store.c	2000/01/11 11:33:41	1.5
+++ store.c	2000/01/23 08:44:22
@@ -179,28 +179,34 @@
 acpi_store_to_objref(struct aml_environ *env,union aml_object *obj, union aml_object *r)
 {
 	int	offset;
+	union aml_object *ref;
 
-	switch(r->objref.ref->type){
+	if (*(r->objref.ref) == NULL) {
+		*(r->objref.ref) = acpi_alloc_object(obj->type, NULL);
+	}
+
+	ref = *(r->objref.ref);
+
+	switch(ref->type){
 	case aml_t_buffer:
 		offset = r->objref.offset;
-		acpi_store_to_buffer(env, obj, r->objref.ref, r->objref.offset);
+		acpi_store_to_buffer(env, obj, ref, r->objref.offset);
 		break;
 
 	case aml_t_package:
 		offset = r->objref.offset;
-		if (r->objref.ref->package.elements < offset) {
-			acpi_realloc_object(r->objref.ref, offset);
+		if ((*(r->objref.ref))->package.elements < offset) {
+			acpi_realloc_object(ref, offset);
 		}
-		if (r->objref.ref->package.objects[offset] == NULL) {
-			r->objref.ref->package.objects[offset] = acpi_alloc_object(obj->type, NULL);
+		if (ref->package.objects[offset] == NULL) {
+			ref->package.objects[offset] = acpi_alloc_object(obj->type, NULL);
 		}
-		acpi_store_to_object(env, obj, r->objref.ref->package.objects[offset]);
+		acpi_store_to_object(env, obj, ref->package.objects[offset]);
 		break;
 	default:
-		acpi_store_to_object(env, obj, r->objref.ref);
+		acpi_store_to_object(env, obj, ref);
 		break;
 	}
-	acpi_free_object(&r);	/* XXX */
 }
 
 /*Store to Named object */

