X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/a109809e4f9d66ad37afebd1eacd247c47e63f2e..beb979b423ffca4eb63aa3ce2de22f9b13d74d4f:/sig/types.hpp diff --git a/sig/types.hpp b/sig/types.hpp index 82ee41e..30d8dbd 100644 --- a/sig/types.hpp +++ b/sig/types.hpp @@ -1,5 +1,5 @@ -/* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2015 Jay Freeman (saurik) +/* Cycript - The Truly Universal Scripting Language + * Copyright (C) 2009-2016 Jay Freeman (saurik) */ /* GNU Affero General Public License, Version 3 {{{ */ @@ -36,7 +36,7 @@ #include "Standard.hpp" class CYPool; -struct CYTypedIdentifier; +struct CYType; struct CYTypedParameter; namespace sig { @@ -57,11 +57,17 @@ struct Type { { } + template + _finline Type_ *Flag(Type_ *type) const { + type->flags = flags; + return type; + } + virtual Type *Copy(CYPool &pool, const char *rename = NULL) const = 0; virtual const char *GetName() const; virtual const char *Encode(CYPool &pool) const = 0; - virtual CYTypedIdentifier *Decode(CYPool &pool) const = 0; + virtual CYType *Decode(CYPool &pool) const = 0; virtual ffi_type *GetFFI(CYPool &pool) const = 0; virtual void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const = 0; @@ -73,11 +79,11 @@ struct Primitive : Type { Primitive *Copy(CYPool &pool, const char *name) const { - return new(pool) Primitive(); + return Flag(new(pool) Primitive()); } const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -101,7 +107,7 @@ struct Void : Void *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -114,7 +120,7 @@ struct Unknown : Unknown *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -124,23 +130,32 @@ struct Unknown : struct String : Type { + String() { + } + + String(bool constant) { + if (constant) + flags |= JOC_TYPE_CONST; + } + String *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; }; +#ifdef CY_OBJECTIVEC struct Meta : Type { Meta *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -153,12 +168,13 @@ struct Selector : Selector *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; }; +#endif struct Bits : Type @@ -173,7 +189,7 @@ struct Bits : Bits *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -193,7 +209,7 @@ struct Pointer : Pointer *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -215,13 +231,14 @@ struct Array : Array *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; }; +#ifdef CY_OBJECTIVEC struct Object : Type { @@ -235,7 +252,41 @@ struct Object : Object *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; + + ffi_type *GetFFI(CYPool &pool) const override; + void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; + JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; +}; +#endif + +struct Constant { + const char *name; + double value; +}; + +struct Enum : + Type +{ + Type &type; + unsigned count; + const char *name; + + Constant *constants; + + Enum(Type &type, unsigned count, const char *name = NULL) : + type(type), + count(count), + name(name), + constants(NULL) + { + } + + Enum *Copy(CYPool &pool, const char *rename = NULL) const override; + const char *GetName() const override; + + const char *Encode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -259,7 +310,7 @@ struct Aggregate : const char *GetName() const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; + CYType *Decode(CYPool &pool) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; @@ -271,8 +322,8 @@ struct Callable : { Signature signature; - CYTypedIdentifier *Decode(CYPool &pool) const override; - virtual CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const = 0; + CYType *Decode(CYPool &pool) const override; + virtual CYType *Modify(CYPool &pool, CYType *result, CYTypedParameter *parameters) const = 0; }; struct Function : @@ -288,26 +339,28 @@ struct Function : Function *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const override; + CYType *Modify(CYPool &pool, CYType *result, CYTypedParameter *parameters) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; }; +#ifdef CY_OBJECTIVEC struct Block : Callable { Block *Copy(CYPool &pool, const char *rename = NULL) const override; const char *Encode(CYPool &pool) const override; - CYTypedIdentifier *Decode(CYPool &pool) const override; - CYTypedIdentifier *Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const override; + CYType *Decode(CYPool &pool) const override; + CYType *Modify(CYPool &pool, CYType *result, CYTypedParameter *parameters) const override; ffi_type *GetFFI(CYPool &pool) const override; void PoolFFI(CYPool *pool, JSContextRef context, ffi_type *ffi, void *data, JSValueRef value) const override; JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override; }; +#endif Type *joc_parse_type(char **name, char eos, bool variable, bool signature); void joc_parse_signature(Signature *signature, char **name, char eos, bool variable);