typedef struct sSpiderScript tSpiderScript;
typedef struct sSpiderVariant tSpiderVariant;
+typedef struct sSpiderNamespace tSpiderNamespace;
typedef struct sSpiderFunction tSpiderFunction;
typedef struct sSpiderValue tSpiderValue;
typedef struct sSpiderObjectDef tSpiderObjectDef;
*/
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
};
+enum eSpiderValueOps
+{
+ SS_VALUEOP_NOP,
+
+ SS_VALUEOP_ADD,
+ SS_VALUEOP_SUBTRACT,
+ SS_VALUEOP_NEGATE,
+ SS_VALUEOP_MULIPLY,
+ SS_VALUEOP_DIVIDE,
+ SS_VALUEOP_MODULO,
+
+ SS_VALUEOP_BITNOT,
+ SS_VALUEOP_BITAND,
+ SS_VALUEOP_BITOR,
+ SS_VALUEOP_BITXOR,
+
+ SS_VALUEOP_SHIFTLEFT,
+ SS_VALUEOP_SHIFTRIGHT,
+ SS_VALUEOP_ROTATELEFT
+};
+
+/**
+ * \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
*/
{
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)
tSpiderFunction *Functions; //!< Functions (Linked List)
int NConstants; //!< Number of constants
tSpiderValue *Constants; //!< Number of constants
+
+ tSpiderNamespace RootNamespace;
};
/**
int ReferenceCount; //!< Reference count
union {
- uint64_t Integer; //!< Integer data
+ int64_t Integer; //!< Integer data
double Real; //!< Real Number data
/**
* \brief String data
/**
* \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
*/
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[];
};
/**
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
};
*/
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_ExecuteFunction(tSpiderScript *Script,
+ tSpiderNamespace *Namespace, const char *Function,
+ int NArguments, tSpiderValue **Arguments
+ );
+/**
+ * \brief Execute an object method
+ */
extern tSpiderValue *SpiderScript_ExecuteMethod(tSpiderScript *Script,
- const char *Function,
+ tSpiderObject *Object, const char *MethodName,
+ int NArguments, tSpiderValue **Arguments
+ );
+/**
+ * \brief Creates an object instance
+ */
+extern tSpiderValue *SpiderScript_CreateObject(tSpiderScript *Script,
+ tSpiderNamespace *Namespace, const char *ClassName,
int NArguments, tSpiderValue **Arguments
);
+/**
+ * \brief Convert a script to bytecode and save to a file
+ */
+extern int SpiderScript_SaveBytecode(tSpiderScript *Script, const char *DestFile);
+/**
+ * \brief Save the AST of a script to a file
+ */
+extern int SpiderScript_SaveAST(tSpiderScript *Script, const char *Filename);
+
/**
* \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 void SpiderScript_DereferenceValue(tSpiderValue *Object);
+extern void SpiderScript_ReferenceValue(tSpiderValue *Object);
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_StringConcat(const tSpiderValue *Str1, const tSpiderValue *Str2);
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);
+
+extern tSpiderValue *SpiderScript_DoOp(tSpiderValue *Left, enum eSpiderValueOps Op, int bCanCast, tSpiderValue *Right);
/**
* \}
*/