Mercurial > MadButterfly
view 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 source
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