SpiderScript - Implementing objects and classes, fixing bugs
[tpg/acess2.git] / Usermode / include / spiderscript.h
index c0d6d45..e6fdaab 100644 (file)
@@ -14,6 +14,7 @@
 typedef struct sSpiderScript   tSpiderScript;
 
 typedef struct sSpiderVariant  tSpiderVariant;
+typedef struct sSpiderNamespace        tSpiderNamespace;
 typedef struct sSpiderFunction tSpiderFunction;
 typedef struct sSpiderValue    tSpiderValue;
 typedef struct sSpiderObjectDef        tSpiderObjectDef;
@@ -22,21 +23,67 @@ typedef struct sSpiderObject        tSpiderObject;
 
 /**
  * \brief SpiderScript Variable Datatypes
+ * \todo Expand the descriptions
  */
 enum eSpiderScript_DataTypes
 {
-       SS_DATATYPE_UNDEF,      //!< Undefined
-       SS_DATATYPE_NULL,       //!< NULL (Probably will never be used)
-       SS_DATATYPE_DYNAMIC,    //!< Dynamically typed variable (will this be used?)
-       SS_DATATYPE_OPAQUE,     //!< Opaque data type
-       SS_DATATYPE_OBJECT,     //!< Object reference
-       SS_DATATYPE_ARRAY,      //!< Array
-       SS_DATATYPE_INTEGER,    //!< Integer (64-bits)
+       /**
+        * \brief Undefined data
+        * \note Default type of an undefined dynamic variable
+        */
+       SS_DATATYPE_UNDEF,
+       /**
+        * \brief Dynamically typed variable
+        * \note Used to dentote a non-fixed type for function parameters
+        */
+       SS_DATATYPE_DYNAMIC,
+       /**
+        * \brief Opaque Data Pointer
+        * 
+        * Opaque data types are used for resource handles or for system buffers.
+        */
+       SS_DATATYPE_OPAQUE,
+       /**
+        * \brief Object reference
+        * 
+        * A reference to a SpiderScript class instance. Can be accessed
+        * using the -> operator.
+        */
+       SS_DATATYPE_OBJECT,
+       /**
+        * \brief Array data type
+        */
+       SS_DATATYPE_ARRAY,
+       /**
+        * \brief Integer datatype
+        * 
+        * 64-bit integer
+        */
+       SS_DATATYPE_INTEGER,
        SS_DATATYPE_REAL,       //!< Real Number (double)
        SS_DATATYPE_STRING,     //!< String
        NUM_SS_DATATYPES
 };
 
+/**
+ * \brief Namespace definition
+ */
+struct sSpiderNamespace
+{
+       tSpiderNamespace        *Next;
+       
+       tSpiderNamespace        *FirstChild;
+       
+       tSpiderFunction *Functions;
+       
+       tSpiderObjectDef        *Classes;
+       
+        int    NConstants;     //!< Number of constants
+       tSpiderValue    *Constants;     //!< Number of constants
+       
+       const char      Name[];
+};
+
 /**
  * \brief Variant of SpiderScript
  */
@@ -44,13 +91,15 @@ struct sSpiderVariant
 {
        const char      *Name;  // Just for debug
        
-        int    bDyamicTyped;   //!< Use static typing
+        int    bDyamicTyped;   //!< Use dynamic typing
+        int    bImplicitCasts; //!< Allow implicit casts (casts to lefthand side)
        
-        int    NFunctions;     //!< Number of functions
-       tSpiderFunction *Functions;     //!< Functions
+       tSpiderFunction *Functions;     //!< Functions (Linked List)
        
         int    NConstants;     //!< Number of constants
        tSpiderValue    *Constants;     //!< Number of constants
+       
+       tSpiderNamespace        RootNamespace;
 };
 
 /**
@@ -107,16 +156,16 @@ struct sSpiderObjectDef
        /**
         * \brief Object type name
         */
-       const char*     const Name;
+       const char * const      Name;
        /**
         * \brief Construct an instance of the object
         * \param NArgs Number of arguments
-        * \param Args  Argument count
+        * \param Args  Argument array
         * \return Pointer to an object instance (which must be fully valid)
         * \retval NULL Invalid parameter (usually, actually just a NULL value)
         * \retval ERRPTR       Invalid parameter count
         */
-       tSpiderObject   *(*Constructor)(int NArgs, tSpiderValue *Args);
+       tSpiderObject   *(*Constructor)(int NArgs, tSpiderValue **Args);
        
        /**
         * \brief Clean up and destroy the object
@@ -126,17 +175,15 @@ struct sSpiderObjectDef
         */
        void    (*Destructor)(tSpiderObject *This);
        
+       tSpiderFunction *Methods;       //!< Method Definitions (linked list)
+       
         int    NAttributes;    //!< Number of attributes
        
        //! Attribute definitions
        struct {
                const char      *Name;  //!< Attribute Name
                 int    bReadOnly;      //!< Allow writes to the attribute?
-       }       *AttributeDefs;
-       
-       
-        int    NMethods;       //!< Number of methods
-       tSpiderFunction *Methods;       //!< Method Definitions
+       }       AttributeDefs[];
 };
 
 /**
@@ -145,7 +192,7 @@ struct sSpiderObjectDef
 struct sSpiderObject
 {
        tSpiderObjectDef        *Type;  //!< Object Type
-        int    NReferences;    //!< Number of references
+        int    ReferenceCount; //!< Number of references
        void    *OpaqueData;    //!< Pointer to the end of the \a Attributes array
        tSpiderValue    *Attributes[];  //!< Attribute Array
 };
@@ -155,6 +202,11 @@ struct sSpiderObject
  */
 struct sSpiderFunction
 {
+       /**
+        * \brief Next function in list
+        */
+       struct sSpiderFunction  *Next;
+       
        /**
         * \brief Function name
         */
@@ -171,7 +223,7 @@ struct sSpiderFunction
         * parameters, if the final entry is -1, the function has a variable
         * number of arguments.
         */
-        int    *ArgTypes;      // Zero (or -1) terminated array of parameter types
+        int    ArgTypes[];     // Zero (or -1) terminated array of parameter types
 };
 
 
@@ -184,19 +236,37 @@ struct sSpiderFunction
  */
 extern tSpiderScript   *SpiderScript_ParseFile(tSpiderVariant *Variant, const char *Filename);
 /**
- * \brief Execute a method from a script
+ * \brief Execute a function from a script
  * \param Script       Script to run
  * \param Function     Name of function to run ("" for the 'main')
  * \return Return value
  */
-extern tSpiderValue    *SpiderScript_ExecuteMethod(tSpiderScript *Script,
-       const char *Function,
+extern tSpiderValue    *SpiderScript_ExecuteFunction(tSpiderScript *Script,
+       tSpiderNamespace *Namespace, const char *Function,
        int NArguments, tSpiderValue **Arguments
        );
 
 /**
  * \brief Free a script
+ * \param Script       Script structure to free
  */
 extern void    SpiderScript_Free(tSpiderScript *Script);
 
+extern tSpiderObject   *SpiderScript_AllocateObject(tSpiderObjectDef *Class, int ExtraBytes);
+
+/**
+ * \name tSpiderValue Manipulation functions
+ * \{
+ */
+extern tSpiderValue    *SpiderScript_CreateInteger(uint64_t Value);
+extern tSpiderValue    *SpiderScript_CreateReal(double Value);
+extern tSpiderValue    *SpiderScript_CreateString(int Length, const char *Data);
+extern tSpiderValue    *SpiderScript_CastValueTo(int Type, tSpiderValue *Source);
+extern int     SpiderScript_IsValueTrue(tSpiderValue *Value);
+extern void    SpiderScript_FreeValue(tSpiderValue *Value);
+extern char    *SpiderScript_DumpValue(tSpiderValue *Value);
+/**
+ * \}
+ */
+
 #endif

UCC git Repository :: git.ucc.asn.au