diff Idea @ 16:ca0bce3b4810

struct copy
author kono
date Mon, 17 Jan 2000 16:08:16 +0900
parents 595a24e0b90e
children df7fa8cee67b
line wrap: on
line diff
--- a/Idea	Mon Jan 17 02:04:48 2000 +0900
+++ b/Idea	Mon Jan 17 16:08:16 2000 +0900
@@ -1086,3 +1086,71 @@
 join は?
 
 funcall を用意すると良いね。
+
+Mon Jan 17 15:23:34 JST 2000
+
+    struct aa f1() {
+	return bb;
+    }
+
+みたいなのは? 関数の型か代入の型を見て、crn にpointerを渡して、
+あとでcopyしてから stack を畳む。
+
+    # 	bb=f1(aaa);
+	    movl $bb,%eax
+	    pushl %eax
+	    movl $aaa,%eax
+	    pushl %eax
+	    call	main2
+	    popl %edx
+	    copy %eax,%edx,$400
+	    addl $400,%esp
+    #     return a1;
+
+あ、でも、それだと、local変数を返したときに困るね。leave; ret;
+してはいけなくて...
+
+あ、やっぱり、こういう場合はコピー先をmain2に引き渡しているみたいね。
+    void f1(struct aa *ret) {
+	*ret = bb ;
+	return;
+    }
+と同じか。これは簡単。
+	f1().a[55]
+みたいな場合は、局所変数に強制的に取ってしまうみたいね。それはそうだ...
+が、うちの実装だとちょっと厳しいか。
+	leal $-sizeof(struct),%esp
+	pushl %esp
+なんだけど、関数呼び出しの途中ではできないから....
+
+    # main(ac,av)
+    # int ac;
+	    .align 2
+    .globl main
+    main:
+	    .type	main,@function
+	    pushl %ebp
+	    movl %esp,%ebp
+	    pushl %ebx
+	    pushl %ecx
+	    pushl %edx
+    # char *av[];
+    # {
+    #     register int i;
+    #     register char *p;
+    #     int j = 3;
+    #     struct { int b; void (*c)(struct aa); } q = {3,main1},r;
+    # 
+    #     j = 3;
+	    subl $20,%esp
+
+このsublを後から指定してやればOk。
+
+でも、それだと jump の時にずれない? ずれるか? ずれるね。うーん。
+実行時にチェックしてやるのも変だし。
+
+まぁ、それほど必要な機能ではないんだけど。
+
+これもcontinuationを渡してやると言う手法が使えないことはないんだが...
+
+関数呼び出しの最初にやってやればいいか。それでできるかな?