X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b21525c7b2b9f64150f97e79f1f0788edbc7b3bf..c3b144b863e63ef68c07545fd7e2b8039c8ee2b0:/sig/ffi_type.cpp diff --git a/sig/ffi_type.cpp b/sig/ffi_type.cpp index 00d04b2..efdaa79 100644 --- a/sig/ffi_type.cpp +++ b/sig/ffi_type.cpp @@ -1,8 +1,32 @@ -#include "minimal/stdlib.h" +/* Cycript - Optimizing JavaScript Compiler/Runtime + * Copyright (C) 2009-2010 Jay Freeman (saurik) +*/ + +/* GNU Lesser General Public License, Version 3 {{{ */ +/* + * Cycript is free software: you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * Cycript is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Cycript. If not, see . +**/ +/* }}} */ + +#include "Error.hpp" #include "sig/ffi_type.hpp" #include "sig/types.hpp" +#define ffi_type_slonglong ffi_type_sint64 +#define ffi_type_ulonglong ffi_type_uint64 + namespace sig { void sig_ffi_types( @@ -29,18 +53,32 @@ 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; case uint_P: return &ffi_type_uint; case ulong_P: return &ffi_type_ulong; - case ulonglong_P: return &ffi_type_ulong; + 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; @@ -53,14 +91,14 @@ ffi_type *ObjectiveC(apr_pool_t *pool, struct Type *type) { case double_P: return &ffi_type_double; case float_P: return &ffi_type_float; case int_P: return &ffi_type_sint; - case long_P: return &ffi_type_sint; - case longlong_P: return &ffi_type_slong; + case long_P: return &ffi_type_slong; + case longlong_P: return &ffi_type_slonglong; case short_P: return &ffi_type_sshort; 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; @@ -84,12 +122,13 @@ 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; case uint_P: return &ffi_type_uint; case ulong_P: return &ffi_type_ulong; - case ulonglong_P: return &ffi_type_ulong; + case ulonglong_P: return &ffi_type_ulonglong; case ushort_P: return &ffi_type_ushort; case array_P: return &ffi_type_pointer; case pointer_P: return &ffi_type_pointer; @@ -101,8 +140,8 @@ ffi_type *Java(apr_pool_t *pool, struct Type *type) { case double_P: return &ffi_type_double; case float_P: return &ffi_type_double; case int_P: return &ffi_type_sint; - case long_P: return &ffi_type_sint; - case longlong_P: return &ffi_type_slong; + case long_P: return &ffi_type_slong; + case longlong_P: return &ffi_type_slonglong; case short_P: return &ffi_type_sshort; case void_P: return &ffi_type_void; case struct_P: return &ffi_type_pointer;