Print error when specified multiple js engines.

Plus, consolidated names: EmitterType, mode, engine -> engine.
This commit is contained in:
Oliver Buchtala 2014-04-26 22:27:12 +02:00
commit 226da453fc

View file

@ -19,6 +19,8 @@
*/ */
static bool js_template_enable_debug = false; static bool js_template_enable_debug = false;
#define ERR_MSG_ONLY_ONE_ENGINE_PLEASE "Only one engine can be specified at a time."
// keywords used for state variables // keywords used for state variables
#define NAME "name" #define NAME "name"
#define NAME_MANGLED "name_mangled" #define NAME_MANGLED "name_mangled"
@ -36,6 +38,9 @@ static bool js_template_enable_debug = false;
#define CTOR_DISPATCHERS "ctor_dispatchers" #define CTOR_DISPATCHERS "ctor_dispatchers"
#define DTOR "dtor" #define DTOR "dtor"
#define ARGCOUNT "wrap:argc" #define ARGCOUNT "wrap:argc"
#define HAS_TEMPLATES "has_templates"
#define FORCE_CPP "force_cpp"
#define RESET true
// keys for global state variables // keys for global state variables
#define CREATE_NAMESPACES "create_namespaces" #define CREATE_NAMESPACES "create_namespaces"
@ -47,10 +52,7 @@ static bool js_template_enable_debug = false;
#define MEMBER_FUNCTIONS "member_functions" #define MEMBER_FUNCTIONS "member_functions"
#define STATIC_FUNCTIONS "static_functions" #define STATIC_FUNCTIONS "static_functions"
#define STATIC_VARIABLES "static_variables" #define STATIC_VARIABLES "static_variables"
#define HAS_TEMPLATES "has_templates"
#define FORCE_CPP "force_cpp"
#define RESET true
/** /**
* A convenience class to manage state variables for emitters. * A convenience class to manage state variables for emitters.
@ -119,12 +121,13 @@ protected:
public: public:
enum JSEmitterType { enum JSEngine {
JavascriptCore, JavascriptCore,
V8 V8,
NodeJS
}; };
JSEmitter(); JSEmitter(JSEngine engine);
virtual ~ JSEmitter(); virtual ~ JSEmitter();
@ -266,6 +269,8 @@ protected:
protected: protected:
JSEngine engine;
Hash *templates; Hash *templates;
State state; State state;
@ -285,6 +290,7 @@ protected:
JSEmitter *swig_javascript_create_JSCEmitter(); JSEmitter *swig_javascript_create_JSCEmitter();
JSEmitter *swig_javascript_create_V8Emitter(); JSEmitter *swig_javascript_create_V8Emitter();
JSEmitter *swig_javascript_create_NodeJSEmitter();
/********************************************************************** /**********************************************************************
* JAVASCRIPT: SWIG module implementation * JAVASCRIPT: SWIG module implementation
@ -501,23 +507,31 @@ void JAVASCRIPT::main(int argc, char *argv[]) {
// Set javascript subdirectory in SWIG library // Set javascript subdirectory in SWIG library
SWIG_library_directory("javascript"); SWIG_library_directory("javascript");
int mode = -1; int engine = -1;
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc; i++) {
if (argv[i]) { if (argv[i]) {
if (strcmp(argv[i], "-v8") == 0) { if (strcmp(argv[i], "-v8") == 0) {
if (engine != -1) {
Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE);
SWIG_exit(-1);
}
Swig_mark_arg(i); Swig_mark_arg(i);
mode = JSEmitter::V8; engine = JSEmitter::V8;
SWIG_library_directory("javascript/v8");
} else if (strcmp(argv[i], "-jsc") == 0) { } else if (strcmp(argv[i], "-jsc") == 0) {
if (engine != -1) {
Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE);
SWIG_exit(-1);
}
Swig_mark_arg(i); Swig_mark_arg(i);
mode = JSEmitter::JavascriptCore; engine = JSEmitter::JavascriptCore;
SWIG_library_directory("javascript/jsc");
} else if (strcmp(argv[i], "-node") == 0) { } else if (strcmp(argv[i], "-node") == 0) {
if (engine) {
Printf(stderr, ERR_MSG_ONLY_ONE_ENGINE_PLEASE);
SWIG_exit(-1);
}
Swig_mark_arg(i); Swig_mark_arg(i);
mode = JSEmitter::V8; engine = JSEmitter::NodeJS;
SWIG_library_directory("javascript/v8");
Preprocessor_define("BUILDING_NODE_EXTENSION 1", 0);
} else if (strcmp(argv[i], "-debug-codetemplates") == 0) { } else if (strcmp(argv[i], "-debug-codetemplates") == 0) {
Swig_mark_arg(i); Swig_mark_arg(i);
js_template_enable_debug = true; js_template_enable_debug = true;
@ -528,11 +542,12 @@ void JAVASCRIPT::main(int argc, char *argv[]) {
} }
} }
switch (mode) { switch (engine) {
case JSEmitter::V8: case JSEmitter::V8:
{ {
emitter = swig_javascript_create_V8Emitter(); emitter = swig_javascript_create_V8Emitter();
Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0); Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0);
SWIG_library_directory("javascript/v8");
// V8 API is C++, so output must be C++ compatibile even when wrapping C code // V8 API is C++, so output must be C++ compatibile even when wrapping C code
if (!cparse_cplusplus) { if (!cparse_cplusplus) {
Swig_cparse_cplusplusout(1); Swig_cparse_cplusplusout(1);
@ -543,11 +558,20 @@ void JAVASCRIPT::main(int argc, char *argv[]) {
{ {
emitter = swig_javascript_create_JSCEmitter(); emitter = swig_javascript_create_JSCEmitter();
Preprocessor_define("SWIG_JAVASCRIPT_JSC 1", 0); Preprocessor_define("SWIG_JAVASCRIPT_JSC 1", 0);
SWIG_library_directory("javascript/jsc");
break;
}
case JSEmitter::NodeJS:
{
emitter = swig_javascript_create_V8Emitter();
Preprocessor_define("SWIG_JAVASCRIPT_V8 1", 0);
Preprocessor_define("BUILDING_NODE_EXTENSION 1", 0);
SWIG_library_directory("javascript/v8");
break; break;
} }
default: default:
{ {
Printf(stderr, "SWIG Javascript: Unknown emitter type. Please specify one of -jsc -v8 or -node.\n"); Printf(stderr, "SWIG Javascript: Unknown engine. Please specify one of '-jsc', '-v8' or '-node'.\n");
SWIG_exit(-1); SWIG_exit(-1);
break; break;
} }
@ -585,8 +609,8 @@ extern "C" Language *swig_javascript(void) {
* JSEmitter() * JSEmitter()
* ----------------------------------------------------------------------------- */ * ----------------------------------------------------------------------------- */
JSEmitter::JSEmitter() JSEmitter::JSEmitter(JSEmitter::JSEngine engine)
: templates(NewHash()), namespaces(NULL), current_namespace(NULL), defaultResultName(NewString("result")), f_wrappers(NULL) { : engine(engine), templates(NewHash()), namespaces(NULL), current_namespace(NULL), defaultResultName(NewString("result")), f_wrappers(NULL) {
} }
/* ----------------------------------------------------------------------------- /* -----------------------------------------------------------------------------
@ -816,21 +840,20 @@ int JSEmitter::emitCtor(Node *n) {
Template t_ctor(getTemplate("js_ctor")); Template t_ctor(getTemplate("js_ctor"));
//String *mangled_name = SwigType_manglestr(Getattr(n, "name"));
String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name")); String *wrap_name = Swig_name_wrapper(Getattr(n, "sym:name"));
if (is_overloaded) { if (is_overloaded) {
t_ctor = getTemplate("js_overloaded_ctor"); t_ctor = getTemplate("js_overloaded_ctor");
Append(wrap_name, Getattr(n, "sym:overname")); Append(wrap_name, Getattr(n, "sym:overname"));
} }
Setattr(n, "wrap:name", wrap_name); Setattr(n, "wrap:name", wrap_name);
// note: removing the is_abstract flag, as this emitter // note: we can remove the is_abstract flag now, as this
// is supposed to be called for non-abstract classes only. // is called for non-abstract classes only.
Setattr(state.clazz(), IS_ABSTRACT, 0); Setattr(state.clazz(), IS_ABSTRACT, 0);
ParmList *params = Getattr(n, "parms"); ParmList *params = Getattr(n, "parms");
emit_parameter_variables(params, wrapper); emit_parameter_variables(params, wrapper);
emit_attach_parmmaps(params, wrapper); emit_attach_parmmaps(params, wrapper);
// HACK: in test-case `ignore_parameter` emit_attach_parmmaps generated an extra line of applied typemap. // HACK: in test-case `ignore_parameter` emit_attach_parmmaps generated an extra line of applied typemaps.
// Deleting wrapper->code here, to reset, and as it seemed to have no side effect elsewhere // Deleting wrapper->code here, to reset, and as it seemed to have no side effect elsewhere
Delete(wrapper->code); Delete(wrapper->code);
wrapper->code = NewString(""); wrapper->code = NewString("");
@ -1157,11 +1180,8 @@ int JSEmitter::emitFunction(Node *n, bool is_member, bool is_static) {
marshalInputArgs(n, params, wrapper, Function, is_member, is_static); marshalInputArgs(n, params, wrapper, Function, is_member, is_static);
String *action = emit_action(n); String *action = emit_action(n);
marshalOutput(n, params, wrapper, action); marshalOutput(n, params, wrapper, action);
emitCleanupCode(n, wrapper, params); emitCleanupCode(n, wrapper, params);
Replaceall(wrapper->code, "$symname", iname); Replaceall(wrapper->code, "$symname", iname);
t_function.replace("$jswrapper", wrap_name) t_function.replace("$jswrapper", wrap_name)
@ -1434,7 +1454,7 @@ private:
}; };
JSCEmitter::JSCEmitter() JSCEmitter::JSCEmitter()
: JSEmitter(), NULL_STR(NewString("NULL")), VETO_SET(NewString("JS_veto_set_variable")), f_wrap_cpp(NULL), f_runtime(NULL), f_header(NULL), f_init(NULL) { : JSEmitter(JSEmitter::JavascriptCore), NULL_STR(NewString("NULL")), VETO_SET(NewString("JS_veto_set_variable")), f_wrap_cpp(NULL), f_runtime(NULL), f_header(NULL), f_init(NULL) {
} }
JSCEmitter::~JSCEmitter() { JSCEmitter::~JSCEmitter() {
@ -1794,7 +1814,7 @@ protected:
virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static); virtual void marshalInputArgs(Node *n, ParmList *parms, Wrapper *wrapper, MarshallingMode mode, bool is_member, bool is_static);
virtual int emitNamespaces(); virtual int emitNamespaces();
private: protected:
/* built-in parts */ /* built-in parts */
String *f_runtime; String *f_runtime;
String *f_header; String *f_header;
@ -1824,7 +1844,7 @@ private:
}; };
V8Emitter::V8Emitter() V8Emitter::V8Emitter()
: JSEmitter(), NULL_STR(NewString("0")), VETO_SET(NewString("JS_veto_set_variable")) { : JSEmitter(JSEmitter::V8), NULL_STR(NewString("0")), VETO_SET(NewString("JS_veto_set_variable")) {
} }
V8Emitter::~V8Emitter() { V8Emitter::~V8Emitter() {
@ -2197,7 +2217,6 @@ JSEmitter *swig_javascript_create_V8Emitter() {
return new V8Emitter(); return new V8Emitter();
} }
/********************************************************************** /**********************************************************************
* Helper implementations * Helper implementations
**********************************************************************/ **********************************************************************/