#define __USE_EXTERN_INLINES
#include <dlfcn.h>
+#include <fcntl.h>
#include <unistd.h>
+#include <sys/mman.h>
#include <sys/stat.h>
#include <sqlite3.h>
case Parsing:
longjmp(ctrlc_, 1);
case Running:
+#ifndef __ANDROID__
CYCancel();
+#endif
return;
case Sending:
return;
}
} file(address.sun_path);
- _syscall(bind(server, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
+ _syscall(bind(server, reinterpret_cast<sockaddr *>(&address), sizeof(address)));
_syscall(chmod(address.sun_path, 0777));
_syscall(listen(server, 1));
return $ CYTypedIdentifier($ CYTypeCharacter(CYTypeNeutral), $ CYTypePointerTo());
}
+#ifdef CY_OBJECTIVEC
CYTypedIdentifier *Meta::Decode(CYPool &pool) const {
return $ CYTypedIdentifier($ CYTypeVariable("Class"));
}
CYTypedIdentifier *Selector::Decode(CYPool &pool) const {
return $ CYTypedIdentifier($ CYTypeVariable("SEL"));
}
+#endif
CYTypedIdentifier *Bits::Decode(CYPool &pool) const {
_assert(false);
return CYDecodeType(pool, &type)->Modify($ CYTypeArrayOf($D(size)));
}
+#ifdef CY_OBJECTIVEC
CYTypedIdentifier *Object::Decode(CYPool &pool) const {
if (name == NULL)
return $ CYTypedIdentifier($ CYTypeVariable("id"));
else
return $ CYTypedIdentifier($ CYTypeVariable(name), $ CYTypePointerTo());
}
+#endif
CYTypedIdentifier *Aggregate::Decode(CYPool &pool) const {
_assert(!overlap);
return result->Modify($ CYTypeFunctionWith(variadic, parameters));
}
+#ifdef CY_OBJECTIVEC
CYTypedIdentifier *Block::Modify(CYPool &pool, CYTypedIdentifier *result, CYTypedParameter *parameters) const {
return result->Modify($ CYTypeBlockWith(parameters));
}
return $ CYTypedIdentifier($ CYTypeVariable("NSBlock"), $ CYTypePointerTo());
return Callable::Decode(pool);
}
+#endif
}
} CYCatch(NULL) }
static JSValueRef Type_callAsFunction_blockWith(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) {
+#ifdef CY_OBJECTIVEC
sig::Block type;
return Type_callAsFunction_$With(context, object, _this, count, arguments, type, exception);
+#else
+ _assert(false);
+#endif
}
static JSValueRef Type_callAsFunction_constant(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
}
};
+#ifndef __ANDROID__
static volatile bool cancel_;
static bool CYShouldTerminate(JSContextRef context, void *arg) {
return cancel_;
}
+#endif
_visible const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code) {
ExecutionHandle handle(context);
+#ifndef __ANDROID__
cancel_ = false;
if (&JSContextGroupSetExecutionTimeLimit != NULL)
JSContextGroupSetExecutionTimeLimit(JSContextGetGroup(context), 0.5, &CYShouldTerminate, NULL);
+#endif
try {
JSValueRef result(_jsccall(JSEvaluateScript, context, CYJSString(code), NULL, NULL, 0));
}
}
+#ifndef __ANDROID__
_visible void CYCancel() {
cancel_ = true;
}
+#endif
const char *CYPoolLibraryPath(CYPool &pool);
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
- _syscall(connect(socket, reinterpret_cast<sockaddr *>(&address), SUN_LEN(&address)));
+ _syscall(connect(socket, reinterpret_cast<sockaddr *>(&address), sizeof(address)));
CYInitializeDynamic();
CYHandleClient(socket);
if (handle == NULL) {
Dl_info info;
_assert(dladdr(reinterpret_cast<void *>(&MSmain0), &info) != 0);
+#ifdef __ANDROID__
+ handle = dlopen(info.dli_fname, 0);
+#else
handle = dlopen(info.dli_fname, RTLD_NOLOAD);
+#endif
}
return NULL;
extern "C" void CYSetupContext(JSGlobalContextRef context);
const char *CYExecute(JSContextRef context, CYPool &pool, CYUTF8String code);
+
+#ifndef __ANDROID__
void CYCancel();
+#endif
void CYSetArgs(int argc, const char *argv[]);
endif
if CY_OBJECTIVEC
+AM_CPPFLAGS += -DCY_OBJECTIVEC
filters += ObjectiveC
libcycript_la_SOURCES += ObjectiveC/Output.cpp ObjectiveC/Replace.cpp ObjectiveC/Library.mm
libcycript_la_LIBADD += $(LTOBJECTIVEC)
@CY_PYTHON_TRUE@am__append_19 = Python
@CY_PYTHON_TRUE@am__append_20 = Python/Execute.cpp
@CY_PYTHON_TRUE@am__append_21 = $(LTPYTHON)
-@CY_OBJECTIVEC_TRUE@am__append_22 = ObjectiveC
-@CY_OBJECTIVEC_TRUE@am__append_23 = ObjectiveC/Output.cpp ObjectiveC/Replace.cpp ObjectiveC/Library.mm
-@CY_OBJECTIVEC_TRUE@am__append_24 = $(LTOBJECTIVEC)
-@CY_ATTACH_TRUE@am__append_25 = Handler.cpp
-@CY_ATTACH_TRUE@@CY_CONSOLE_TRUE@am__append_26 = Inject.cpp
-@CY_ATTACH_TRUE@@CY_CONSOLE_TRUE@am__append_27 = -DCY_ATTACH
+@CY_OBJECTIVEC_TRUE@am__append_22 = -DCY_OBJECTIVEC
+@CY_OBJECTIVEC_TRUE@am__append_23 = ObjectiveC
+@CY_OBJECTIVEC_TRUE@am__append_24 = ObjectiveC/Output.cpp ObjectiveC/Replace.cpp ObjectiveC/Library.mm
+@CY_OBJECTIVEC_TRUE@am__append_25 = $(LTOBJECTIVEC)
+@CY_ATTACH_TRUE@am__append_26 = Handler.cpp
+@CY_ATTACH_TRUE@@CY_CONSOLE_TRUE@am__append_27 = Inject.cpp
+@CY_ATTACH_TRUE@@CY_CONSOLE_TRUE@am__append_28 = -DCY_ATTACH
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \
ACLOCAL_AMFLAGS = -I m4
AM_CPPFLAGS = -DYYDEBUG=1 -DCY_SYSTEM="\"$(CY_SYSTEM)\"" -include \
config.h -include $(srcdir)/unconfig.h $(am__append_5) \
- $(am__append_27)
+ $(am__append_22) $(am__append_28)
AM_CFLAGS = -fvisibility=hidden
AM_CXXFLAGS = -fvisibility=hidden
AM_OBJCXXFLAGS = -fvisibility=hidden -fobjc-exceptions
libcycript_la_LDFLAGS = $(CY_LDFLAGS)
libcycript_la_LIBADD = $(LTLIBUV) $(LTLIBFFI) $(LTLIBSQLITE3) \
$(LTLIBGCC) -ldl $(am__append_3) $(am__append_13) \
- $(am__append_18) $(am__append_21) $(am__append_24)
+ $(am__append_18) $(am__append_21) $(am__append_25)
libcycript_la_SOURCES = ConvertUTF.c Decode.cpp Driver.cpp Error.cpp \
Highlight.cpp Library.cpp Network.cpp Output.cpp Replace.cpp \
Syntax.cpp Parser.cpp Scanner.cpp $(am__append_1) \
$(am__append_2) $(am__append_12) $(am__append_17) \
- $(am__append_20) $(am__append_23) $(am__append_25)
+ $(am__append_20) $(am__append_24) $(am__append_26)
filters = $(am__append_6) $(am__append_11) $(am__append_16) \
- $(am__append_19) $(am__append_22)
-@CY_CONSOLE_TRUE@cycript_SOURCES = Console.cpp $(am__append_26)
+ $(am__append_19) $(am__append_23)
+@CY_CONSOLE_TRUE@cycript_SOURCES = Console.cpp $(am__append_27)
@CY_CONSOLE_TRUE@cycript_LDADD = libcycript.la $(LTLIBREADLINE) $(LTLIBTERMCAP) $(LTLIBGCC) $(PTHREAD_CFLAGS) -ldl
@CY_EXECUTE_TRUE@@CY_PRELINK_TRUE@CY_LANGFLAGS = -DCY_JAVA=$(CY_JAVA) -DCY_PYTHON=$(CY_PYTHON) -DCY_OBJECTIVEC=$(CY_OBJECTIVEC)
all: config.h
#include "Driver.hpp"
#include "Parser.hpp"
#include "Stack.hpp"
+#include "Syntax.hpp"
#define CYNew new(driver.pool_)
@begin ObjectiveC
rm -rf build.and-armeabi
mkdir -p build.and-armeabi
cd build.and-armeabi
-cfg ../configure CPPFLAGS="-I../ncurses.and/include -I../readline.and -I../android -I../libffi.and/include" LDFLAGS="-L../ncurses.and/lib -L../readline.and -L../android/armeabi -L../libffi.and ${ldf[*]}"
+cpp+=(-I../ncurses.and/include -I../readline.and -I../android -I../libffi.and/include)
+ldf+=(-L../ncurses.and/lib -L../readline.and -L../android/armeabi -L../libffi.and/.libs)
+cfg ../configure "$@"
ndk=~/bin/android-ndk
abi=armeabi
ver=4.9
-bin=${ndk}/toolchains/arm-linux-androideabi-${ver}/prebuilt/darwin-x86_64/bin
+api=9
+bld=darwin-x86_64
+bin=${ndk}/toolchains/arm-linux-androideabi-${ver}/prebuilt/${bld}/bin
#export PATH=${bin}:$PATH
flg=()
-flg+=(--sysroot=${ndk}/platforms/android-9/arch-arm)
+flg+=(--sysroot=${ndk}/platforms/android-${api}/arch-arm)
flg+=(-I${ndk}/sources/cxx-stl/gnu-libstdc++/${ver}/include)
flg+=(-I${ndk}/sources/cxx-stl/gnu-libstdc++/${ver}/libs/${abi}/include)
ldf=()
tgt=arm-linux-androideabi
cc=${bin}/${tgt}-gcc
cxx=${bin}/${tgt}-g++
+cpp=()
+cpp+=(-fPIE)
+ldf+=(-rdynamic -fPIE -pie)
function cfg() {
cfg=$1
shift
- CC="${cc} ${flg[*]}" CXX="${cxx} ${flg[*]}" OBJCXX="${cxx} ${flg[*]}" "${cfg}" --host="${tgt}" LDFLAGS="${ldf[*]}" "$@"
+ CC="${cc} ${flg[*]}" CXX="${cxx} ${flg[*]}" OBJCXX="${cxx} ${flg[*]}" "${cfg}" --host="${tgt}" CPPFLAGS="${cpp[*]}" LDFLAGS="${ldf[*]}" "$@"
}
return 0;
}
_ACEOF
-for ac_lib in '' sqlite3; do
+for ac_lib in '' sqlite3 sqlite; do
if test -z "$ac_lib"; then
ac_res="none required"
else
return 0;
}
_ACEOF
-for ac_lib in '' dvm; do
+for ac_lib in '' art dvm; do
if test -z "$ac_lib"; then
ac_res="none required"
else
done
+ CY_OBJECTIVEC=1
if test "x$GNUSTEP_CONFIG" != x; then :
+ CY_OBJECTIVEC=1
for element in `$GNUSTEP_CONFIG --objc-flags`; do
+else
+
+ CY_OBJECTIVEC=0
+
+
fi
ac_ext=cpp
])])
CY_LT_LIB([LTLIBSQLITE3], [AC_CHECK_HEADERS([sqlite3.h], [
- AC_SEARCH_LIBS([sqlite3_open_v2], [sqlite3])
+ AC_SEARCH_LIBS([sqlite3_open_v2], [sqlite3 sqlite])
])])
AC_CHECK_HEADERS([ffi.h ffi/ffi.h], [break])
AC_SUBST([CY_JAVA], [1])
], [AC_CHECK_HEADER([jni.h], [
AC_SUBST([CY_JAVA], [1])
- AC_SEARCH_LIBS([JNI_GetCreatedJavaVMs], [dvm], [
+ AC_SEARCH_LIBS([JNI_GetCreatedJavaVMs], [art dvm], [
])
], [
AC_SUBST([CY_JAVA], [0])
CY_LT_LIB([LTOBJECTIVEC], [AC_CHECK_FRAMEWORK([CoreFoundation], [
#include <CoreFoundation/CFBase.h>
], [CFAllocatorGetDefault();], [
- AC_SUBST([CY_OBJECTIVEC])
+ AC_SUBST([CY_OBJECTIVEC], [1])
AC_CHECK_FRAMEWORK([Foundation], [
#include <Foundation/NSObject.h>
AC_CHECK_PROGS([GNUSTEP_CONFIG], [gnustep-config])
AS_IF([test "x$GNUSTEP_CONFIG" != x], [
- AC_SUBST([CY_OBJECTIVEC])
+ AC_SUBST([CY_OBJECTIVEC], [1])
AC_LIB_APPENDTOVAR([OBJCXXFLAGS], [`$GNUSTEP_CONFIG --objc-flags`])
AC_LIB_APPENDTOVAR([LIBS], [`$GNUSTEP_CONFIG --base-libs`])
], [AC_SUBST([CY_OBJECTIVEC], [0])])
])])
+ ], [
+ AC_SUBST([CY_OBJECTIVEC], [0])
])
AC_LANG_POP([Objective C++])
return new(pool) String();
}
+#ifdef CY_OBJECTIVEC
Meta *Meta::Copy(CYPool &pool, const char *rename) const {
return new(pool) Meta();
}
Selector *Selector::Copy(CYPool &pool, const char *rename) const {
return new(pool) Selector();
}
+#endif
Bits *Bits::Copy(CYPool &pool, const char *rename) const {
return new(pool) Bits(size);
return new(pool) Array(*type.Copy(pool), size);
}
+#ifdef CY_OBJECTIVEC
Object *Object::Copy(CYPool &pool, const char *rename) const {
return new(pool) Object(pool.strdup(name));
}
+#endif
Aggregate *Aggregate::Copy(CYPool &pool, const char *rename) const {
Aggregate *copy(new(pool) Aggregate(overlap, rename ?: pool.strdup(name)));
return copy;
}
+#ifdef CY_OBJECTIVEC
Block *Block::Copy(CYPool &pool, const char *rename) const {
Block *copy(new(pool) Block());
sig::Copy(pool, copy->signature, signature);
return copy;
}
+#endif
void Copy(CYPool &pool, ffi_type &lhs, ffi_type &rhs) {
lhs.size = rhs.size;
return &ffi_type_pointer;
}
+#ifdef CY_OBJECTIVEC
ffi_type *Meta::GetFFI(CYPool &pool) const {
return &ffi_type_pointer;
}
ffi_type *Selector::GetFFI(CYPool &pool) const {
return &ffi_type_pointer;
}
+#endif
ffi_type *Bits::GetFFI(CYPool &pool) const {
/* XXX: we can totally make this work */
return ffi;
}
+#ifdef CY_OBJECTIVEC
ffi_type *Object::GetFFI(CYPool &pool) const {
return &ffi_type_pointer;
}
+#endif
ffi_type *Aggregate::GetFFI(CYPool &pool) const {
// XXX: we can totally make overlap work
_assert(false);
}
+#ifdef CY_OBJECTIVEC
ffi_type *Block::GetFFI(CYPool &pool) const {
return &ffi_type_pointer;
}
+#endif
void sig_ffi_cif(CYPool &pool, size_t variadic, const Signature &signature, ffi_cif *cif) {
_assert(signature.count != 0);
parse:
switch (next) {
case '?': type = new(pool) Unknown(); break;
+
+#ifdef CY_OBJECTIVEC
case '#': type = new(pool) Meta(); break;
+#endif
case '(':
type = new(pool) Aggregate(true);
goto aggregate;
case '*': type = new(pool) String(); break;
+
+#ifdef CY_OBJECTIVEC
case ':': type = new(pool) Selector(); break;
case '@': {
}
} break;
+#endif
case 'B': type = new(pool) Primitive<bool>(); break;
case 'C': type = new(pool) Primitive<unsigned char>(); break;
_assert(false); // XXX: why is this here?!?
else {
type = Parse_(pool, encoding, eos, named, callback);
+#ifdef CY_OBJECTIVEC
Aggregate *aggregate(dynamic_cast<Aggregate *>(type));
if (aggregate != NULL && strcmp(aggregate->name, "_objc_class") == 0)
type = new(pool) Meta();
else
+#endif
type = new(pool) Pointer(*type);
}
break;
return "*";
}
+#ifdef CY_OBJECTIVEC
const char *Meta::Encode(CYPool &pool) const {
return "#";
}
const char *Selector::Encode(CYPool &pool) const {
return ":";
}
+#endif
const char *Bits::Encode(CYPool &pool) const {
return pool.strcat("b", pool.itoa(size), NULL);
return pool.strcat("[", pool.itoa(size), type.Encode(pool), "]", NULL);
}
+#ifdef CY_OBJECTIVEC
const char *Object::Encode(CYPool &pool) const {
return name == NULL ? "@" : pool.strcat("@\"", name, "\"", NULL);
}
+#endif
const char *Aggregate::Encode(CYPool &pool) const {
return pool.strcat(overlap ? "(" : "{", name == NULL ? "?" : name, "=", Unparse(pool, &signature), overlap ? ")" : "}", NULL);
return "?";
}
+#ifdef CY_OBJECTIVEC
const char *Block::Encode(CYPool &pool) const {
return "@?";
}
+#endif
const char *Unparse(CYPool &pool, const struct Type *type) {
const char *base(type->Encode(pool));
JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override;
};
+#ifdef CY_OBJECTIVEC
struct Meta :
Type
{
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
JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override;
};
+#ifdef CY_OBJECTIVEC
struct Object :
Type
{
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 Aggregate :
Type
JSValueRef FromFFI(JSContextRef context, ffi_type *ffi, void *data, bool initialize, JSObjectRef owner) const override;
};
+#ifdef CY_OBJECTIVEC
struct Block :
Callable
{
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);