[mapguide-commits] r7623 - in sandbox/jng/node/Oem/SWIGEx: . Source/Modules Win32
svn_mapguide at osgeo.org
svn_mapguide at osgeo.org
Sat Jun 15 00:02:28 PDT 2013
Author: jng
Date: 2013-06-15 00:02:28 -0700 (Sat, 15 Jun 2013)
New Revision: 7623
Added:
sandbox/jng/node/Oem/SWIGEx/Source/Modules/nodejs.cxx
Modified:
sandbox/jng/node/Oem/SWIGEx/
sandbox/jng/node/Oem/SWIGEx/Makefile
sandbox/jng/node/Oem/SWIGEx/Source/Modules/swigmain.cxx
sandbox/jng/node/Oem/SWIGEx/SwigEx.vcproj
sandbox/jng/node/Oem/SWIGEx/Win32/Swig.exe
Log:
Add a skeleton node.js module to SWIG. This is just a skeleton generator that outputs comments about the MapGuide classes and its members. Just to make sure we're on the right track.
Property changes on: sandbox/jng/node/Oem/SWIGEx
___________________________________________________________________
Added: svn:ignore
+ Debug
Release
Modified: sandbox/jng/node/Oem/SWIGEx/Makefile
===================================================================
--- sandbox/jng/node/Oem/SWIGEx/Makefile 2013-06-14 12:48:24 UTC (rev 7622)
+++ sandbox/jng/node/Oem/SWIGEx/Makefile 2013-06-15 07:02:28 UTC (rev 7623)
@@ -78,6 +78,7 @@
Source/Modules/main.cxx \
Source/Modules/module.cxx \
Source/Modules/mzscheme.cxx \
+ Source/Modules/nodejs.cxx \
Source/Modules/ocaml.cxx \
Source/Modules/overload.cxx \
Source/Modules/perl5.cxx \
@@ -136,6 +137,7 @@
Linux/obj/release/main.o \
Linux/obj/release/module.o \
Linux/obj/release/mzscheme.o \
+ Linux/obj/release/nodejs.o \
Linux/obj/release/ocaml.o \
Linux/obj/release/overload.o \
Linux/obj/release/perl5.o \
Added: sandbox/jng/node/Oem/SWIGEx/Source/Modules/nodejs.cxx
===================================================================
--- sandbox/jng/node/Oem/SWIGEx/Source/Modules/nodejs.cxx (rev 0)
+++ sandbox/jng/node/Oem/SWIGEx/Source/Modules/nodejs.cxx 2013-06-15 07:02:28 UTC (rev 7623)
@@ -0,0 +1,337 @@
+#include "swigmod.h"
+#include <vector>
+
+#define EXPORTS_VAR "exports"
+
+class Indenter
+{
+private:
+ int& m_level;
+
+public:
+ Indenter(int& level) : m_level(level)
+ {
+ m_level++;
+ }
+ ~Indenter() { m_level--; }
+};
+
+class NODEJS : public Language
+{
+private:
+ String* m_namespace;
+ String* m_currentClassName;
+ File* m_fOutputFile;
+ std::vector<std::string> m_classDecls;
+ std::vector<std::string> m_exportCalls;
+ std::string m_currentFragment;
+ std::string m_currentExportFragment;
+ int m_indentationLevels;
+
+public:
+ NODEJS() :
+ m_namespace(NULL),
+ m_currentClassName(NULL),
+ m_fOutputFile(NULL),
+ m_indentationLevels(0)
+ { }
+
+ virtual void main(int argc, char* argv[])
+ {
+ printf("NodeJS module\n");
+ for (int i = 1; i < argc; i++)
+ {
+ if (argv[i])
+ {
+ if (strcmp(argv[i], "-namespace") == 0)
+ {
+ if (argv[i+1])
+ {
+ m_namespace = NewString("");
+ Printf(m_namespace, argv[i+1]);
+ Swig_mark_arg(i);
+ Swig_mark_arg(i+1);
+ i++;
+ }
+ else
+ {
+ Swig_arg_error();
+ }
+ }
+ else if (strcmp(argv[i], "") == 0)
+ {
+ Swig_mark_arg(i);
+ }
+ }
+ }
+
+ Preprocessor_define("SWIGNODEJS 1", 0);
+ SWIG_typemap_lang("nodejs");
+ }
+
+ virtual int top(Node* n)
+ {
+ String *outfile = Getattr(n,"outfile");
+ Printf(stdout, "Generating code to %s\n", outfile);
+
+ m_fOutputFile = NewFile(outfile, "w");
+ if (!m_fOutputFile)
+ {
+ Printf(stderr, "Unable to open %s\n", outfile);
+ SWIG_exit(EXIT_FAILURE);
+ }
+
+ String* modName = NewString(Getattr(n, "name"));
+ Swig_banner(m_fOutputFile);
+
+ writeToFile("#include <node.h>\n\n\n");
+
+ writeToFile("//TODO: Need to include MapGuide headers here\n\n\n");
+
+ Language::top(n);
+
+ for (std::vector<std::string>::iterator it = m_classDecls.begin(); it != m_classDecls.end(); it++)
+ {
+ std::string call = (*it);
+ writeToFile(call);
+ writeToFile("\n");
+ }
+
+ writeToFile(NewStringf("extern \"C\" void init(v8::Handle<v8::Object> %s) {\n", EXPORTS_VAR));
+
+ for (std::vector<std::string>::iterator it = m_exportCalls.begin(); it != m_exportCalls.end(); it++)
+ {
+ std::string call = (*it);
+ writeToFile(call);
+ writeToFile("\n");
+ }
+
+ writeToFile("}\n");
+ writeToFile(NewStringf("NODE_MODULE(%s, init)\n", modName));
+ return SWIG_OK;
+ }
+
+ virtual int functionWrapper(Node* n)
+ {
+ String* name = Getattr(n,"sym:name");
+ SwigType *type = Getattr(n,"type");
+ ParmList *parms = Getattr(n,"parms");
+
+ String* entry = NewString("MgInitializeWebTier");
+ String* ctorPrefix = NewString("new_");
+ String* dtorPrefix = NewString("delete_");
+ if (Strstr(name, entry))
+ {
+ writeToFile(NewStringf("//Global Function: %s\n", name));
+ writeToFile(NewStringf("static v8::Handle<v8::Value> %s(const v8::Arguments& args) {\n", name));
+ {
+ Indenter ind(m_indentationLevels);
+ writeToFile("v8::HandleScope scope;\n");
+ writeToFile("return scope.Close();\n");
+ }
+ writeToFile("}\n");
+ }
+ else if (Strstr(name, ctorPrefix))
+ {
+ writeToCurrentClassFragment(NewStringf("//\ctor Function Wrapper: %s\n", name));
+ writeToCurrentClassFragment(NewStringf("static v8::Handle<v8::Value> %s(const v8::Arguments& args) {\n", name));
+ {
+ Indenter ind(m_indentationLevels);
+ writeToCurrentClassFragment("v8::HandleScope scope;\n");
+ writeToCurrentClassFragment("return scope.Close();\n");
+ }
+ writeToCurrentClassFragment("}\n");
+ }
+ else if (Strstr(name, dtorPrefix))
+ {
+ writeToCurrentClassFragment(NewStringf("//dtor Function Wrapper: %s\n", name));
+ writeToCurrentClassFragment(NewStringf("static v8::Handle<v8::Value> %s(const v8::Arguments& args) {\n", name));
+ {
+ Indenter ind(m_indentationLevels);
+ writeToCurrentClassFragment("v8::HandleScope scope;\n");
+ writeToCurrentClassFragment("return scope.Close();\n");
+ }
+ writeToCurrentClassFragment("}\n");
+ }
+ Language::functionWrapper(n);
+ return SWIG_OK;
+ }
+
+ void writeTabs()
+ {
+ if (m_indentationLevels > 0)
+ {
+ for (int i = 0; i < m_indentationLevels; i++)
+ {
+ Printf(m_fOutputFile, "\t");
+ }
+ }
+ }
+
+ void writeTabsToCurrentFragment()
+ {
+ if (m_indentationLevels > 0)
+ {
+ for (int i = 0; i < m_indentationLevels; i++)
+ {
+ m_currentFragment += "\t";
+ }
+ }
+ }
+
+ void writeToCurrentClassFragment(String* str, bool bDelete = true)
+ {
+ writeTabsToCurrentFragment();
+ m_currentFragment += Char(str);
+ if (bDelete)
+ Delete(str);
+ }
+
+ void writeToCurrentClassFragment(const std::string& str)
+ {
+ writeTabsToCurrentFragment();
+ m_currentFragment += str;
+ }
+
+ void writeToCurrentClassFragment(const char* str)
+ {
+ writeTabsToCurrentFragment();
+ m_currentFragment += str;
+ }
+
+ void writeToFile(String* str, bool bDelete = true)
+ {
+ writeTabs();
+ Printf(m_fOutputFile, "%s", str);
+ if (bDelete)
+ Delete(str);
+ }
+
+ void writeToFile(const std::string& str)
+ {
+ writeTabs();
+ Printf(m_fOutputFile, str.c_str());
+ }
+
+ void writeToFile(const char* str)
+ {
+ writeTabs();
+ Printf(m_fOutputFile, str);
+ }
+
+ virtual int classHandler(Node* n)
+ {
+ m_currentFragment = std::string();
+ m_currentExportFragment = std::string();
+
+ m_currentClassName = NewString(Getattr(n,"sym:name"));
+
+ writeToCurrentClassFragment(NewStringf("//Node.js wrapper for class: %s\n", m_currentClassName));
+
+ m_currentExportFragment += "//TODO: Write export call for ";
+ m_currentExportFragment += Char(m_currentClassName);
+
+ std::string proxyClsName = "Proxy";
+ proxyClsName += Char(m_currentClassName);
+ std::string clsHead = "class ";
+ clsHead += proxyClsName;
+ clsHead += " : node::ObjectWrap\n";
+
+ writeToCurrentClassFragment(clsHead);
+ writeToCurrentClassFragment("{\n");
+ writeToCurrentClassFragment("protected:\n");
+ {
+ Indenter ind(m_indentationLevels);
+ std::string ptrDecl = "Ptr<";
+ ptrDecl += Char(m_currentClassName);
+ ptrDecl += "> m_ptr;\n";
+ writeToCurrentClassFragment(ptrDecl);
+ }
+ writeToCurrentClassFragment("public:\n");
+ std::string ctorDecl;
+ ctorDecl += proxyClsName;
+ ctorDecl += "(";
+ ctorDecl += Char(m_currentClassName);
+ ctorDecl += "* ptr)\n";
+ {
+ Indenter ind(m_indentationLevels);
+ writeToCurrentClassFragment(ctorDecl);
+ writeToCurrentClassFragment("{\n");
+ writeToCurrentClassFragment("\tm_ptr = SAFE_ADDREF(ptr);\n");
+ writeToCurrentClassFragment("}\n");
+ }
+ std::string dtorDecl;
+ dtorDecl += "~";
+ dtorDecl += proxyClsName;
+ dtorDecl += "()\n";
+ {
+ Indenter ind(m_indentationLevels);
+ writeToCurrentClassFragment(dtorDecl);
+ writeToCurrentClassFragment("{\n");
+ writeToCurrentClassFragment("\tm_ptr = NULL;\n");
+ writeToCurrentClassFragment("}\n");
+ }
+
+ {
+ Indenter ind(m_indentationLevels);
+ Language::classHandler(n);
+ }
+
+ writeToCurrentClassFragment("};");
+
+ Delete(m_currentClassName);
+ m_currentClassName = NULL;
+
+ m_classDecls.push_back(m_currentFragment);
+ m_exportCalls.push_back(m_currentExportFragment);
+
+ return SWIG_OK;
+ }
+
+ virtual int memberconstantHandler(Node* n)
+ {
+ String* name = Getattr(n, "sym:name");
+ writeToCurrentClassFragment(NewStringf("//\tMember Constant: %s::%s\n", m_currentClassName, name));
+ return SWIG_OK;
+ }
+
+ virtual int memberfunctionHandler(Node* n)
+ {
+ String* name = Getattr(n, "sym:name");
+ String* overloaded_name = Copy(getOverloadedName(n));
+ String* overloaded_name_qualified = Swig_name_member(m_currentClassName, overloaded_name);
+
+ writeToCurrentClassFragment(NewStringf("//\tMember Function: %s::%s\n", m_currentClassName, overloaded_name));
+ writeToCurrentClassFragment(NewStringf("static v8::Handle<v8::Value> %s(const v8::Arguments& args) {\n", overloaded_name_qualified));
+ {
+ Indenter ind(m_indentationLevels);
+ writeToCurrentClassFragment("v8::HandleScope scope;\n");
+ writeToCurrentClassFragment("return scope.Close();\n");
+ }
+ writeToCurrentClassFragment("}\n");
+ Delete(overloaded_name);
+ return SWIG_OK;
+ }
+
+ virtual int membervariableHandler(Node* n)
+ {
+ String* name = Getattr(n, "sym:name");
+ writeToCurrentClassFragment(NewStringf("//\tMember Variable: %s::%s\n", m_currentClassName, name));
+ return SWIG_OK;
+ }
+
+ String *getOverloadedName(Node *n, bool bFullyQualified = false)
+ {
+ String *overloaded_name = NewStringf("%s", Getattr(n,"sym:name"));
+
+ if (Getattr(n,"sym:overloaded")) {
+ Printv(overloaded_name, Getattr(n,"sym:overname"), NIL);
+ }
+
+ return overloaded_name;
+ }
+};
+
+extern "C" Language * swig_nodejs(void) {
+ return new NODEJS();
+}
\ No newline at end of file
Modified: sandbox/jng/node/Oem/SWIGEx/Source/Modules/swigmain.cxx
===================================================================
--- sandbox/jng/node/Oem/SWIGEx/Source/Modules/swigmain.cxx 2013-06-14 12:48:24 UTC (rev 7622)
+++ sandbox/jng/node/Oem/SWIGEx/Source/Modules/swigmain.cxx 2013-06-15 07:02:28 UTC (rev 7623)
@@ -50,6 +50,7 @@
Language *swig_xml(void);
Language *swig_chicken(void);
Language *swig_csharp(void);
+ Language *swig_nodejs(void);
}
struct swig_module {
@@ -67,6 +68,7 @@
{"-csharp", swig_csharp, "C#"},
{"-guile", swig_guile, "Guile"},
{"-java", swig_java, "Java"},
+ {"-nodejs", swig_nodejs, "NodeJS"},
{"-mzscheme", swig_mzscheme, "Mzscheme"},
{"-ocaml", swig_ocaml, "Ocaml"},
{"-perl", swig_perl5, "Perl"},
Modified: sandbox/jng/node/Oem/SWIGEx/SwigEx.vcproj
===================================================================
--- sandbox/jng/node/Oem/SWIGEx/SwigEx.vcproj 2013-06-14 12:48:24 UTC (rev 7622)
+++ sandbox/jng/node/Oem/SWIGEx/SwigEx.vcproj 2013-06-15 07:02:28 UTC (rev 7623)
@@ -4,6 +4,7 @@
Version="9.00"
Name="SwigEx"
ProjectGUID="{18F8AE78-14F3-4C6A-9768-CF5A1A5194D7}"
+ RootNamespace="SwigEx"
Keyword="Win32Proj"
TargetFrameworkVersion="131072"
>
@@ -376,6 +377,10 @@
>
</File>
<File
+ RelativePath=".\Source\Modules\nodejs.cxx"
+ >
+ </File>
+ <File
RelativePath=".\Source\Modules\ocaml.cxx"
>
</File>
Modified: sandbox/jng/node/Oem/SWIGEx/Win32/Swig.exe
===================================================================
(Binary files differ)
More information about the mapguide-commits
mailing list