# HG changeset patch # User Thinker K.F. Li # Date 1280928786 -28800 # Node ID 08fd45d119c95edae6778d6ca8f72e9ce565ef95 # Parent 974d98233eab94554b59395a75927c82a6da0702 Binding generator supports self-init constructor function diff -r 974d98233eab -r 08fd45d119c9 tools/gen_v8_binding.m4 --- a/tools/gen_v8_binding.m4 Mon Aug 02 10:14:33 2010 +0800 +++ b/tools/gen_v8_binding.m4 Wed Aug 04 21:33:06 2010 +0800 @@ -272,19 +272,19 @@ define([START_METHOD_RET], [dnl define([INT], [ - return Integer::New(_ret); + _ret_val = Integer::New(_ret); ])dnl define([NUMBER], [ - return Number::New(_ret); + _ret_val = Number::New(_ret); ])dnl define([OBJ], [ - return PROJ_PREFIX[]$][1[]_new(_ret); + _ret_val = PROJ_PREFIX[]$][1[]_new(_ret); ])dnl define([STR], [ - return String::New(_ret); + _ret_val = String::New(_ret); ])dnl define([FUNC], [ - return _ret; + _rt_val = _ret; ])dnl ]) @@ -299,7 +299,15 @@ ]) define([START_METHOD], [dnl +dnl +dnl METHOD(name, func, arguments, cnt, ret_type, options) +dnl define([METHOD], [ +dnl +ifelse($][6, [], [], [dnl +foreach([ITER], ]$][6[, [EXPAND([define]ITER)])dnl +])dnl +dnl static Handle PROJ_PREFIX[]STRUCT_NAME[]_$][1(const Arguments &args) { int i; @@ -309,6 +317,7 @@ const char *_err = NULL; foreach([ITER], $][3, [START_METHOD_ARG_VAR[]ITER[]STOP_METHOD_ARG])dnl START_METHOD_RET_VAL[]$][5[]STOP_METHOD_ARG + Handle _ret_val; if(argc != $][4) THROW("Invalid number of arguments (!=$][4)"); @@ -326,8 +335,19 @@ START_METHOD_RET[]$][5[]STOP_METHOD_ARG[]dnl ifelse($][5, [], [ return Null(); +], [dnl +dnl +dnl Modify returned object +dnl +ifdef([MOD], [ + MOD[](self, _ret_val); +])dnl + return _ret_val; ])dnl } +ifelse($][6, [], [], [dnl +foreach([ITER], ]$][6[, [EXPAND([undefine]ITER)])dnl +])dnl ])dnl ]) @@ -388,14 +408,41 @@ undefine([FIRST])dnl ]) +define([CTOR_INTERNAL], [dnl + int argc = args.Length(); + Handle self = args.This(); + $4 *obj; +foreach([ITER], $2, [START_METHOD_ARG_VAR[]ITER[]STOP_METHOD_ARG])dnl + int i; + + if(argc != $3) + THROW("Invalid number of arguments (!=$][4)"); + i = 0; + if(0]dnl +[foreach([ITER], $2, [START_METHOD_ARG_TYPE_CHK[]ITER[]STOP_METHOD_ARG])) + THROW("Invalid argument type"); + + i = 0; +foreach([ITER], $2, [START_METHOD_ARG_ASSIGN[]ITER[]STOP_METHOD_ARG])dnl + +define([SEP], [])dnl + obj = ($4 *)$1(foreach([ITER], $2, [START_METHOD_ARG_PASS[]SEP[]ITER[]STOP_METHOD_ARG[]define([SEP], [, ])]));[]undefine([SEP]) + + WRAP(self, obj); +]) + dnl -dnl STRUCT(struct_name, struct_type, member_vars, methods) +dnl STRUCT(struct_name, struct_type, member_vars, methods, options) dnl define([STRUCT], [dnl define([STRUCT_NAME], [$1])dnl define([STRUCT_TYPE], [$2])dnl dnl -ifelse([$5], [], [], [foreach([ITER], $5, [EXPAND([define]ITER)])])dnl +ifelse([$5], [], [], [dnl +foreach([ITER], $5, [dnl +EXPAND([define]ITER)[]dnl +])dnl +])dnl dnl [ /* ************************************************** @@ -404,7 +451,9 @@ */ static Handle ]PROJ_PREFIX[$1(const Arguments &args) { -} +]ifdef([CTOR], [EXPAND([CTOR_INTERNAL](EXPAND([UNQUOTE]CTOR), [$2]))])dnl + return Null(); +[} static Persistent ]PROJ_PREFIX[$1][_temp;