diff --git a/Lib/javascript/v8/javascriptcode.swg b/Lib/javascript/v8/javascriptcode.swg index 070ef2e2d..527efe115 100644 --- a/Lib/javascript/v8/javascriptcode.swg +++ b/Lib/javascript/v8/javascriptcode.swg @@ -55,16 +55,30 @@ fail: return scope.Close(v8::Undefined()); }%} -/* -%fragment ("JS_mainctordefn", "templates") -%{ - // TODO: implement JS_mainctordefn +%fragment ("JS_mainctordefn", "templates") %{ +v8::Handle $jswrapper(const v8::Arguments& args) { + v8::HandleScope scope; + + v8::TryCatch tryCatch; + // switch all cases by means of series of if-returns. + $jsdispatchcases + + // default: + if(!tryCatch.HasCaught()) + SWIG_exception_fail(SWIG_ERROR, "Illegal arguments for contruction of $jsmangledname"); + +fail: + scope.Close(v8::Undefined()); +} %} -*/ %fragment ("JS_ctor_dispatch_case", "templates") -%{ - // TODO: implement JS_ctor_dispatch_case +%{if(args.Length() == $jsargcount) { + v8::Handle self = $jswrapper(args); + if(!self->IsUndefined()) { + tryCatch.Reset(); return scope.Close(self); /* reset exception and return */ + } + } %} %fragment ("JS_destructordefn", "templates") diff --git a/Source/Modules/javascript.cxx b/Source/Modules/javascript.cxx index e7fa8801a..a6261394f 100644 --- a/Source/Modules/javascript.cxx +++ b/Source/Modules/javascript.cxx @@ -837,6 +837,7 @@ int JSEmitter::emitCtor(Node *n) { String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); Template t_mainctor(getTemplate("JS_mainctordefn")); t_mainctor.replace(T_WRAPPER, wrap_name) + .replace(T_NAME_MANGLED, state.clazz(NAME_MANGLED)) .replace(T_DISPATCH_CASES, state.clazz(CTOR_DISPATCHERS)) .pretty_print(f_wrappers); state.clazz(CTOR, wrap_name); @@ -1845,7 +1846,7 @@ void V8Emitter::marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, Mar } // store number of arguments for argument checks - int num_args = emit_num_arguments(parms) - startIdx; + int num_args = emit_num_arguments(parms); String *argcount = NewString(""); Printf(argcount, "%d", num_args); Setattr(n, ARGCOUNT, argcount);