[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