changeset 15:907c69e21e56

modify allocate
author Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
date Tue, 14 Apr 2015 03:37:22 +0900
parents d98961bfd0f2
children 481760d44d87
files doc/ChangeLog.txt src/allocate/CMakeLists.txt src/allocate/allocate.c src/allocate/allocateContext.c src/allocate/allocateContext.h src/include/allocate.h src/include/origin_cs.h
diffstat 7 files changed, 48 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/doc/ChangeLog.txt	Fri Apr 10 17:57:38 2015 +0900
+++ b/doc/ChangeLog.txt	Tue Apr 14 03:37:22 2015 +0900
@@ -1,7 +1,15 @@
+Mon Apr 13 20:13:54 JST 2015 kkb
+
+    version 管理も built in であるべき
+    プログラムを走らせるときに使うコードセグメントの集合は決まってる
+    unix の command に相当
+    context がすべて知っている必要がある
+    プログラムの走り方で dynamic loding liblary が変わる
+    Reflection を意識したプログラミング
+
 Fri Apr 10 17:52:46 JST 2015 Tatsuki IHA
 
     context.hにdata segmentの型を定義
     code segmentのaddressはcontextが持つ
     呼ぶcode segmentはenumで持つ
     code segmentにはdefaultで一つdata segmentを持つ
-
--- a/src/allocate/CMakeLists.txt	Fri Apr 10 17:57:38 2015 +0900
+++ b/src/allocate/CMakeLists.txt	Tue Apr 14 03:37:22 2015 +0900
@@ -2,4 +2,5 @@
 
 add_executable(allocate
                allocate.c
+               allocateContext.c
 )
--- a/src/allocate/allocate.c	Fri Apr 10 17:57:38 2015 +0900
+++ b/src/allocate/allocate.c	Tue Apr 14 03:37:22 2015 +0900
@@ -1,9 +1,8 @@
 #include <stdio.h>
 #include <stdlib.h>
 
-#include "prototype.h"
+#include "allocateContext.h"
 
-#include "context.h"
 #include "allocate.h"
 #include "origin_cs.h"
 
@@ -22,13 +21,13 @@
 }
 */
 
-__code code1(Context* context) {
-    context->data[0]->Allocate.size = sizeof(long);
-    context->data[0]->Allocate.next = Code2;
+__code code1(struct Context* context) {
+    context->data[0]->allocate.size = sizeof(long);
+    context->data[0]->allocate.next = Code2;
     goto meta(context, Allocate);
 }
 
-__code meta(Context* context, enum Code next) {
+__code meta(struct Context* context, enum Code next) {
     goto (context->code[next])(context);
 }
 
@@ -39,26 +38,27 @@
 }
 */
 
-__code code2(Context* context) {
+__code code2(struct Context* context) {
     context->data[1]->count = 0;
     goto meta(context, Code3);
 }
 
-__code code3(Context* context) {
+__code code3(struct Context* context) {
     long loop = context->data[1]->count;
     if (loop == NUM) {
         goto meta(context, Exit);
     }
-    printf("%d\n", loop);
+    printf("%ld\n", loop);
     context->data[1]->count++;
     goto meta(context, Code3);
 }
 
 int main() {
-    Context* context = (Context*)malloc(sizeof(Context));
-    context->ds_heap = malloc(sizeof(data1)*1024);
-    context->mds_heap = malloc(sizeof(mdata)*1024);
-    context->ds = context->ds_heap;
-    context->mds = context->mds_heap;
-    goto start_code(context, code1);
+    struct Context* context = (struct Context*)malloc(sizeof(struct Context));
+    context->code = malloc(sizeof(__code*)*1024);
+    context->data = malloc(sizeof(union Data**)*1024);
+    for (int i=0;i<1024;i++)
+        context->data[i] = malloc(sizeof(union Data*));
+    initAllocateContext(context);
+    goto start_code(context, Code1);
 }
--- a/src/allocate/allocateContext.c	Fri Apr 10 17:57:38 2015 +0900
+++ b/src/allocate/allocateContext.c	Tue Apr 14 03:37:22 2015 +0900
@@ -2,8 +2,10 @@
 extern __code code1(struct Context*);
 extern __code code2(struct Context*);
 extern __code code3(struct Context*);
+extern __code meta(struct Context*);
 extern __code allocate(struct Context*);
 extern __code exit_code(struct Context*);
+extern __code initAllocateContext(struct Context*);
 
 __code initAllocateContext(struct Context* context) {
     
@@ -13,4 +15,5 @@
     context->code[Code3]    = code3;
     context->code[Allocate] = allocate;
     context->code[Exit]     = exit_code;
+    context->dataSize = 0;
 }
--- a/src/allocate/allocateContext.h	Fri Apr 10 17:57:38 2015 +0900
+++ b/src/allocate/allocateContext.h	Tue Apr 14 03:37:22 2015 +0900
@@ -1,25 +1,25 @@
 /* Context definition for allocate example */
 
 enum Code {
-    Code1;
-    Code2;
-    Code3;
-    Allocate;
-    Exit;
-}
+    Code1,
+    Code2,
+    Code3,
+    Allocate,
+    Exit,
+};
 
 struct Context {
     int codeSize;
-    __code (*code[]) (struct Context *);
+    __code (**code) (struct Context *);
     int dataSize;
-    union Data *data[];
-}
+    union Data **data;
+};
 
 union Data {
-    char data[];
+    char data[8];
     long count;
     struct Allocate {
         long size;
         enum Code next;
     } allocate;
-}
+};
--- a/src/include/allocate.h	Fri Apr 10 17:57:38 2015 +0900
+++ b/src/include/allocate.h	Tue Apr 14 03:37:22 2015 +0900
@@ -1,16 +1,12 @@
 __code allocate();
 __code meta_allocate();
+extern __code meta();
 
-__code allocate(Context* context, int size, int num, __code (*next)()) {
-    goto meta_allocate(context, size, num, next);
+__code allocate(struct Context* context) {
+    goto meta_allocate(context);
 }
 
-__code meta_allocate(Context* context, int size, int num, __code (*next)()) {
-    context->next = next;
-    void* ds = context->ds;
-    context->ds += size*num;
-    ((mdata*)context->mds)->ds = ds;
-    ((mdata*)context->mds)->size = size;
-    context->mds = (mdata*)context->mds+1;
-    goto context->next(context, (data1*)ds);
+__code meta_allocate(struct Context* context) {
+    context->dataSize++;
+    goto (context->code[context->data[context->dataSize-1]->allocate.next])(context);
 }
--- a/src/include/origin_cs.h	Fri Apr 10 17:57:38 2015 +0900
+++ b/src/include/origin_cs.h	Tue Apr 14 03:37:22 2015 +0900
@@ -1,18 +1,10 @@
 __code start_code();
-__code meta_start_code();
 __code exit_code();
 
-__code start_code(Context* context, __code (*next)()) {
-    goto meta_start_code(context, next);
+__code start_code(struct Context* context, enum Code next) {
+    goto meta(context, next);
 }
 
-__code meta_start_code(Context* context, __code (*next)()) {
-    context->next = next;
-    goto context->next(context);
-}
-
-__code exit_code(Context* context) {
-    free(context->ds_heap);
-    free(context->mds_heap);
+__code exit_code(struct Context* context) {
     goto exit(0);
 }