# HG changeset patch # User Shohei KOKUBO # Date 1428950242 -32400 # Node ID 907c69e21e5655350e39953feecbaf4d9906285e # Parent d98961bfd0f2eaa62e964db3f33b954851d25137 modify allocate diff -r d98961bfd0f2 -r 907c69e21e56 doc/ChangeLog.txt --- 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を持つ - diff -r d98961bfd0f2 -r 907c69e21e56 src/allocate/CMakeLists.txt --- 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 ) diff -r d98961bfd0f2 -r 907c69e21e56 src/allocate/allocate.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 #include -#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); } diff -r d98961bfd0f2 -r 907c69e21e56 src/allocate/allocateContext.c --- 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; } diff -r d98961bfd0f2 -r 907c69e21e56 src/allocate/allocateContext.h --- 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; -} +}; diff -r d98961bfd0f2 -r 907c69e21e56 src/include/allocate.h --- 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); } diff -r d98961bfd0f2 -r 907c69e21e56 src/include/origin_cs.h --- 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); }