Mercurial > MadButterfly
diff tools/gen_v8_binding.m4 @ 648:e13dbfd37eab
JS binding generator and observer definition with the generator
author | Thinker K.F. Li <thinker@branda.to> |
---|---|
date | Thu, 29 Jul 2010 01:02:29 +0800 |
parents | |
children | 2030e5d9f7f7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/gen_v8_binding.m4 Thu Jul 29 01:02:29 2010 +0800 @@ -0,0 +1,228 @@ +changequote(`[', `]')dnl +include([foreach.m4])dnl +divert([-1])dnl + +define([UNQUOTE], [$*]) + +define([QUOTE], [[[$*]]]) + +define([COUNT],[ifelse([$*],[],0,[$#])]) + +define([IMPORT],[define([$1],[$2$1(]$[]@[)])]) + +define([PROJ_PREFIX], [xnjsmb_]) + +define([START_ACCESSOR], [dnl +divert([-1])dnl + define([INT], [ +static Handle<Value> +]PROJ_PREFIX[]STRUCT_NAME[_get_$][1(Local<String> property, const AccessorInfo &info) { + return Integer::New(data->$][1); +} + +static void +]PROJ_PREFIX[]STRUCT_NAME[_set_$][1(Local<String> property, + Local<Value> value, + const AccessorInfo &info) { + Handle<Object> self = info.This(); + STRUCT_TYPE *data; + + data = (STRUCT_TYPE *)UNWRAP(self); + data->$][1 = value->Int32Value(); +} +]) + define([OBJ], [ +static Handle<Value> +]PROJ_PREFIX[]STRUCT_NAME[_get_$][1(Local<String> property, const AccessorInfo &info) { + return ]PROJ_PREFIX[$][2_new(data->$][1); +} + +static void +]PROJ_PREFIX[]STRUCT_NAME[_set_$][1(Local<String> property, + Local<Value> value, + const AccessorInfo &info) { + Handle<Object> self = info.This(); + Handle<Object> obj; + $][2 *v; + STRUCT_TYPE *data; + + data = UNWRAP(self); + obj = value->ToObject(); + v = ($][2 *)UNWRAP(obj); + data->$][1 = v; +} +]) + define([STR], [ +static Handle<Value> +]PROJ_PREFIX[]STRUCT_NAME[_get_$][1(Local<String> property, const AccessorInfo &info) { + return String::New(data->$][1); +} + +static void +]PROJ_PREFIX[]STRUCT_NAME[_set_$][1(Local<String> property, + Local<Value> value, + const AccessorInfo &info) { + Handle<Object> self = info.This(); + STRUCT_TYPE *data; + + data = (STRUCT_TYPE *)UNWRAP(self); + String::Utf8Value utf8(value->ToString()); + free(data->$][1); + data->$][1 = strdup(*utf8); +} +]) +divert([])dnl +]) + +define([STOP_ACCESSOR], [dnl +divert([-1])dnl +undefine([INT]) +undefine([OBJ]) +undefine([STR]) +divert([])dnl +]) + +define([SET_ACCESSSOR], [dnl +define([INT], [$][1])dnl +define([OBJ], [$][1])dnl +define([STR], [$][1])dnl + inst_temp->SetAccessor(String::New("$1"), + PROJ_PREFIX[]STRUCT_NAME[]_get_[]$1, + PROJ_PREFIX[]STRUCT_NAME[]_set_[]$1); +undefine([INT])dnl +undefine([OBJ])dnl +undefine([STR])dnl +]) + +define([START_METHOD_ARG_VAR], [dnl +define([INT], [dnl + int $][1];)dnl +define([OBJ], [dnl + $][2 *$][1];)dnl +define([STR], [dnl + char *$][1];)dnl +define([FUNC], [ + Handle<Function> $][1];)dnl +]) + +define([START_METHOD_ARG_TYPE_CHK], [dnl +define([INT], [ || + !args[[i++]]->IsInt32()])dnl +define([OBJ], [ || + !args[[i++]]->IsObject()])dnl +define([STR], [ || + !args[[i++]]->IsString()])dnl +define([FUNC], [ || + !args[[i++]]->IsFunction()])dnl +]) + +define([START_METHOD_ARG_ASSIGN], [dnl +define([INT], [ + $][1 = args[[i++]]->Int32Value();])dnl +define([OBJ], [ + $][1 = ($][2 *)UNWRAP(args[[i++]]->ToObject());])dnl +define([STR], [ + $][1 = strdup(*String::Utf8Value(args[[i++]]->ToString()));])dnl +define([FUNC], [ + $][1 = Function::Cast(args[[i++]]);])dnl +]) + +define([START_METHOD_ARG_PASS], [dnl +define([INT], [$][1])dnl +define([OBJ], [$][1])dnl +define([STR], [$][1])dnl +define([FUNC], [$][1])dnl +]) + +define([STOP_METHOD_ARG], [dnl +undefine([INT])dnl +undefine([OBJ])dnl +undefine([STR])dnl +undefine([FUNC])dnl +]) + +define([START_METHOD], [dnl +define([METHOD], [ +static Handle<Value> +PROJ_PREFIX[]STRUCT_NAME[]_$][1(const Arguments &args) { + int i; + int argc = args.Length(); + Handle<Object> self = args.This(); + STRUCT_TYPE *_self = (STRUCT_TYPE *)UNWRAP(self); +foreach([ITER], $][3, [START_METHOD_ARG_VAR[]ITER[]STOP_METHOD_ARG]) + + if(argc != $][4) + THROW("Invalid number of arguments (!=$][4)"); + i = 0; + if(0]dnl +[foreach([ITER], $][3, [START_METHOD_ARG_TYPE_CHK[]ITER[]STOP_METHOD_ARG])) + THROW("Invalid argument type"); + + i = 0; +foreach([ITER], $][3, [START_METHOD_ARG_ASSIGN[]ITER[]STOP_METHOD_ARG])) + + $][2(_self[]foreach([ITER], $][3, [START_METHOD_ARG_PASS[], ITER[]STOP_METHOD_ARG])); +} +])dnl +]) + +define([STOP_METHOD], [undefine([METHOD])]) + +define([SET_METHOD], [dnl +define([METHOD], [dnl + SET(proto_temp, "$][1", + FunctionTemplate::New(PROJ_PREFIX[]STRUCT_NAME[]_$][1)); +])dnl +$1[]dnl +undefine([METHOD])dnl +]) + +define([STRUCT], [dnl +define([STRUCT_NAME], [$1])dnl +define([STRUCT_TYPE], [$2])dnl +[ +/* ************************************************** + * STRUCT: $1 + * Generated by gen_v8_binding.m4 + */ +static Handle<Value> +]PROJ_PREFIX[$1(const Arguments &args) { +} + +static Persistent<FunctionTemplate> ]PROJ_PREFIX[$1][_temp; + +static Handle<Value> +]PROJ_PREFIX[$1][_new($2 *data) { + Handle<Object> obj; + Handle<Function> func; + + func = ]PROJ_PREFIX[$1][_temp->GetFunction(); + obj = func->NewInstance(); + WRAP(obj, data); + + return obj; +} +]dnl +foreach([ITER], ($3), [START_ACCESSOR ITER STOP_ACCESSOR])dnl +foreach([ITER], ($4), [START_METHOD ITER STOP_METHOD])dnl +[ +static void +]PROJ_PREFIX[$1][_init(void) { + Handle<FunctionTemplate> func_temp; + Handle<ObjectTemplate> inst_temp; + Handle<ObjectTemplate> proto_temp; + + func_temp = FunctionTemplate::New(]PROJ_PREFIX[$1); + func_temp->SetClassName("]STRUCT_NAME["); + inst_temp = func_temp->InstanceTemplate(); + inst_temp->SetInternalFieldCount(1); + ] +foreach([ITER], ($3), [SET_ACCESSSOR(ITER)])dnl + inst_temp = func_temp->InstanceTemplate(); + +foreach([ITER], ($4), [SET_METHOD(ITER)])dnl + + PROJ_PREFIX[$1][_temp = Persistent<FunctionTemplate>::New(func_temp); +}]dnl +]) +divert([])dnl