X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b4aa79afea0c26718af8880c3ee8fea63eb21563..5d7cc6d52918fbf09b9af24f6165961cae52836f:/sig/ffi_type.cpp diff --git a/sig/ffi_type.cpp b/sig/ffi_type.cpp index 7092dda..e542ba4 100644 --- a/sig/ffi_type.cpp +++ b/sig/ffi_type.cpp @@ -1,4 +1,4 @@ -/* Cycript - Remove Execution Server and Disassembler +/* Cycript - Inlining/Optimizing JavaScript Compiler * Copyright (C) 2009 Jay Freeman (saurik) */ @@ -37,7 +37,7 @@ */ /* }}} */ -#include "minimal/stdlib.h" +#include "Error.hpp" #include "sig/ffi_type.hpp" #include "sig/types.hpp" @@ -71,6 +71,7 @@ ffi_type *ObjectiveC(apr_pool_t *pool, struct Type *type) { case string_P: return &ffi_type_pointer; case selector_P: return &ffi_type_pointer; + case block_P: return &ffi_type_pointer; case object_P: return &ffi_type_pointer; case boolean_P: return &ffi_type_uchar; case uchar_P: return &ffi_type_uchar; @@ -79,10 +80,23 @@ ffi_type *ObjectiveC(apr_pool_t *pool, struct Type *type) { case ulonglong_P: return &ffi_type_ulonglong; case ushort_P: return &ffi_type_ushort; - case array_P: - /* XXX: implement */ - _assert(false); - break; + case array_P: { + // XXX: this is really lame + ffi_type *aggregate(reinterpret_cast(apr_palloc(pool, sizeof(ffi_type)))); + aggregate->size = 0; + aggregate->alignment = 0; + aggregate->type = FFI_TYPE_STRUCT; + + ffi_type *element(ObjectiveC(pool, type->data.data.type)); + size_t size(type->data.data.size); + + aggregate->elements = reinterpret_cast(apr_palloc(pool, (size + 1) * sizeof(ffi_type *))); + for (size_t i(0); i != size; ++i) + aggregate->elements[i] = element; + aggregate->elements[size] = NULL; + + return aggregate; + } break; case pointer_P: return &ffi_type_pointer; @@ -102,7 +116,7 @@ ffi_type *ObjectiveC(apr_pool_t *pool, struct Type *type) { case void_P: return &ffi_type_void; case struct_P: { - ffi_type *aggregate = reinterpret_cast(apr_palloc(pool, sizeof(ffi_type))); + ffi_type *aggregate(reinterpret_cast(apr_palloc(pool, sizeof(ffi_type)))); aggregate->size = 0; aggregate->alignment = 0; aggregate->type = FFI_TYPE_STRUCT; @@ -126,6 +140,7 @@ ffi_type *Java(apr_pool_t *pool, struct Type *type) { case union_P: return &ffi_type_pointer; case string_P: return &ffi_type_pointer; case selector_P: return &ffi_type_pointer; + case block_P: return &ffi_type_pointer; case object_P: return &ffi_type_pointer; case boolean_P: return &ffi_type_uchar; case uchar_P: return &ffi_type_uchar;