From 88c977fa56f8665f6e37653a015be485aad6d063 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Tue, 1 Sep 2009 07:26:57 +0000 Subject: [PATCH] Initial bridge support. --- Bridge.def | 506 +++++++++++++++++++++++++++++++++++++++++++++++++++++ Tweak.mm | 217 +++++++++-------------- makefile | 33 ++-- 3 files changed, 607 insertions(+), 149 deletions(-) create mode 100644 Bridge.def diff --git a/Bridge.def b/Bridge.def new file mode 100644 index 0000000..3dd4fb0 --- /dev/null +++ b/Bridge.def @@ -0,0 +1,506 @@ +C YES true +C NO false +C nil null + +l objc + +F class_addIvar B#*LC* +F class_addMethod B#:^?* +F class_addProtocol B#@ +F class_conformsToProtocol B#@ +F class_copyIvarList ^^{objc_ivar=}#^I +F class_copyMethodList ^^{objc_method=}#^I +F class_copyPropertyList ^^{objc_property=}#^I +F class_copyProtocolList ^@#^I +F class_createInstance @#L +F class_getClassMethod ^{objc_method=}#: +F class_getClassVariable ^{objc_ivar=}#* +F class_getInstanceMethod ^{objc_method=}#: +F class_getInstanceSize L# +F class_getInstanceVariable ^{objc_ivar=}#* +F class_getIvarLayout *# +F class_getMethodImplementation ^?#: +F class_getMethodImplementation_stret ^?#: +F class_getName *# +F class_getProperty ^{objc_property=}#* +F class_getSuperclass ## +F class_getVersion i# +F class_getWeakIvarLayout *# +F class_isMetaClass B# +F class_replaceMethod ^?#:^?* +F class_respondsToSelector B#: +F class_setIvarLayout v#* +F class_setSuperclass ### +F class_setVersion v#i +F class_setWeakIvarLayout v#* + +F ivar_getName *^{objc_ivar=} +F ivar_getOffset i^{objc_ivar=} +F ivar_getTypeEncoding *^{objc_ivar=} + +F method_copyArgumentType ^c^{objc_method=}I +F method_copyReturnType ^c^{objc_method=} +F method_exchangeImplementations v^{objc_method=}^{objc_method=} +F method_getArgumentType v^{objc_method=}I^cL +F method_getImplementation ^?^{objc_method=} +F method_getName :^{objc_method=} +F method_getNumberOfArguments I^{objc_method=} +F method_getReturnType v^{objc_method=}^cL +F method_getTypeEncoding *^{objc_method=} +F method_setImplementation ^?^{objc_method=}^? + +F objc_allocateClassPair ##*L +F objc_copyProtocolList ^@^I +F objc_duplicateClass ##*L +F objc_getClass #* +F objc_getClassList i^#i +F objc_getFutureClass #* +F objc_getMetaClass @* +F objc_getProtocol @* +F objc_getRequiredClass @* +F objc_lookUpClass @* +F objc_registerClassPair v# +F objc_setFutureClass v#* + +F object_copy @@L +F object_dispose @@ +F object_getClass #@ +F object_getClassName *@ +F object_getIndexedIvars ^v@ +F object_getInstanceVariable ^{objc_ivar=}@*^^v +F object_getIvar @@^{objc_ivar=} +F object_setClass #@# +F object_setInstanceVariable ^{objc_ivar=}@*^v +F object_setIvar v@^{objc_ivar=}@ + +F property_getAttributes *^{objc_property=} +F property_getName *^{objc_property=} + +F protocol_conformsToProtocol B@@ +F protocol_copyMethodDescriptionList ^{objc_method_description=:*}@BB^I +F protocol_copyPropertyList ^{objc_property=}@^I +F protocol_copyProtocolList ^@@^I +F protocol_getMethodDescription {objc_method_description=:*}@:BB +F protocol_getName *@ +F protocol_getProperty ^{objc_property=}@*BB +F protocol_isEqual B@@ + +F sel_getName *: +F sel_getUid :* +F sel_isEqual B:: +F sel_registerName :* + +f UIKit + +F UIApplicationUseLegacyEvents vB + +F UIAccessibilityPostNotification vI@ +F UIApplicationMain ii^^c@@ +F UIGraphicsEndImageContext v +F UIGraphicsGetCurrentContext @ +F UIGraphicsGetImageFromCurrentImageContext @ +F UIGraphicsPopContext v +F UIGraphicsPushContext v@ +F UIImageJPEGRepresentation @@ +F UIImagePNGRepresentation @@ +F UIImageWriteToSavedPhotosAlbum v@@:^v + +F UIKeyboardDisableAutomaticAppearance v +F UIKeyboardEnableAutomaticAppearance v +F UIKeyboardInputModeUsesKBStar B@ + +F _UIImageWithName @@ + +F UIUnformattedPhoneNumberFromString @@ + +V UIApp @ + +V kUIButtonBarButtonAction @ +V kUIButtonBarButtonInfo @ +V kUIButtonBarButtonInfoOffset @ +V kUIButtonBarButtonSelectedInfo @ +V kUIButtonBarButtonSizeToFit @ +V kUIButtonBarButtonStyle @ +V kUIButtonBarButtonTag @ +V kUIButtonBarButtonTarget @ +V kUIButtonBarButtonTitle @ +V kUIButtonBarButtonTitleVerticalHeight @ +V kUIButtonBarButtonTitleWidth @ +V kUIButtonBarButtonType @ + +V UIKeyboardAnimationCurveUserInfoKey @ +V UIKeyboardAnimationDurationUserInfoKey @ +V UIKeyboardBoundsUserInfoKey @ +V UIKeyboardCenterBeginUserInfoKey @ +V UIKeyboardCenterEndUserInfoKey @ +V UIKeyboardRequiresInternationalKey @ + +V UIKeyboardCandidateCorrectionDidChangeNotification @ +V UIKeyboardCurrentInputModeDidChangeNotification @ +V UIKeyboardDefaultsDidChangeNotification @ +V UIKeyboardDidHideNotification @ +V UIKeyboardDidShowNotification @ +V UIKeyboardEmptyDelegateNotification @ +V UIKeyboardWillHideNotification @ +V UIKeyboardWillShowNotification @ + +V UIWebViewDidReceiveMessageNotification @ +V UIWebViewDidClearMessagesNotification @ +V UIWebViewGrowsAndShrinksToFitHeight f +V UIWebViewGrowsAndShrinksToFitWidth f +V UIWebViewScalesToFitScale f + +f AddressBook + +F ABAddressBookAddRecord B@@^@ +F ABAddressBookCopyArrayOfAllGroups @@ +F ABAddressBookCopyArrayOfAllPeople @@ +F ABAddressBookCopyLocalizedLabel @@ +F ABAddressBookCreate @ +F ABAddressBookGetGroupCount l@ +F ABAddressBookGetPersonCount l@ +F ABAddressBookHasUnsavedChanges B@ +F ABAddressBookRegisterExternalChangeCallback v@^?^v +F ABAddressBookRemoveRecord B@@^@ +F ABAddressBookRevert v@ +F ABAddressBookSave B@^@ +F ABAddressBookUnregisterExternalChangeCallback v@^?^v + +V ABAddressBookErrorDomain @ +C kABOperationNotPermittedByStoreError 0 + +F ABMultiValueCopyArrayOfAllValues @@ +F ABMultiValueCopyLabelAtIndex @@l +F ABMultiValueCopyValueAtIndex @@l +F ABMultiValueGetCount l@ +F ABMultiValueGetFirstIndexOfValue l@@ +F ABMultiValueGetIdentifierAtIndex i@l +F ABMultiValueGetIndexForIdentifier l@i +F ABMultiValueGetPropertyType S@ + +C kABMultiValueInvalidIdentifier -1 + +F ABMultiValueAddValueAndLabel @@@^i +F ABMultiValueCreateMutable @S +F ABMultiValueCreateMutableCopy @@ +F ABMultiValueInsertValueAndLabelAtIndex B@@@l^i +F ABMultiValueRemoveValueAndLabelAtIndex B@l +F ABMultiValueReplaceLabelAtIndex B@@l +F ABMultiValueReplaceValueAtIndex B@@l + +F ABRecordCopyCompositeName @@ +F ABRecordCopyValue @@i +F ABRecordGetRecordID i@ +F ABRecordGetRecordType I@ +F ABRecordRemoveValue B@i^@ +F ABRecordSetValue B@i@^@ + +C kABPersonType 0 +C kABGroupType 1 + +# this was (1<<8) +C kABMultiValueMask 0x100 + +C kABInvalidPropertyType 0x0 +C kABStringPropertyType 0x1 +C kABIntegerPropertyType 0x2 +C kABRealPropertyType 0x3 +C kABDateTimePropertyType 0x4 +C kABDictionaryPropertyType 0x5 +C kABMultiStringPropertyType 0x101 +C kABMultiIntegerPropertyType 0x102 +C kABMultiRealPropertyType 0x103 +C kABMultiDateTimePropertyType 0x104 +C kABMultiDictionaryPropertyType 0x105 + +C kABRecordInvalidID -1 +C kABPropertyInvalidID -1 + +F ABAddressBookGetGroupWithRecordID @@i +F ABGroupAddMember B@@^@ +F ABGroupCopyArrayOfAllMembers @@ +F ABGroupCopyArrayOfAllMembersWithSortOrdering @@I +F ABGroupCreate @ +F ABGroupRemoveMember B@@^@ + +V kABGroupNameProperty i + +F ABAddressBookCopyPeopleWithName @@@ +F ABAddressBookGetPersonWithRecordID @@i +F ABPersonComparePeopleByName i@@I +F ABPersonCopyImageData @@ +F ABPersonCopyLocalizedPropertyName @i +F ABPersonCreate @ +F ABPersonGetCompositeNameFormat I +F ABPersonGetSortOrdering I +F ABPersonGetTypeOfProperty SI +F ABPersonHasImageData B@ +F ABPersonRemoveImageData B@^@ +F ABPersonSetImageData B@@^@ + +C kABPersonSortByFirstName 0 +C kABPersonSortByLastName 1 + +C kABPersonCompositeNameFormatFirstNameFirst 0 +C kABPersonCompositeNameFormatLastNameFirst 1 + +V kABPersonFirstNameProperty i +V kABPersonLastNameProperty i +V kABPersonMiddleNameProperty i +V kABPersonPrefixProperty i +V kABPersonSuffixProperty i +V kABPersonNicknameProperty i +V kABPersonFirstNamePhoneticProperty i +V kABPersonLastNamePhoneticProperty i +V kABPersonMiddleNamePhoneticProperty i +V kABPersonOrganizationProperty i +V kABPersonJobTitleProperty i +V kABPersonDepartmentProperty i +V kABPersonEmailProperty i +V kABPersonBirthdayProperty i +V kABPersonNoteProperty i +V kABPersonCreationDateProperty i +V kABPersonModificationDateProperty i + +V kABPersonAddressProperty i +V kABPersonAddressStreetKey @ +V kABPersonAddressCityKey @ +V kABPersonAddressStateKey @ +V kABPersonAddressZIPKey @ +V kABPersonAddressCountryKey @ +V kABPersonAddressCountryCodeKey @ + +V kABPersonDateProperty i +V kABPersonAnniversaryLabel @ + +V kABPersonKindProperty i +V kABPersonKindPerson @ +V kABPersonKindOrganization @ + +V kABPersonPhoneProperty i +V kABPersonPhoneMobileLabel @ +V kABPersonPhoneIPhoneLabel @ +V kABPersonPhoneMainLabel @ +V kABPersonPhoneHomeFAXLabel @ +V kABPersonPhoneWorkFAXLabel @ +V kABPersonPhonePagerLabel @ + +V kABPersonInstantMessageProperty i +V kABPersonInstantMessageServiceKey @ +V kABPersonInstantMessageServiceYahoo @ +V kABPersonInstantMessageServiceJabber @ +V kABPersonInstantMessageServiceMSN @ +V kABPersonInstantMessageServiceICQ @ +V kABPersonInstantMessageServiceAIM @ +V kABPersonInstantMessageUsernameKey @ + +V kABPersonURLProperty i +V kABPersonHomePageLabel @ + +V kABPersonRelatedNamesProperty i +V kABPersonMotherLabel @ +V kABPersonFatherLabel @ +V kABPersonParentLabel @ +V kABPersonSisterLabel @ +V kABPersonBrotherLabel @ +V kABPersonChildLabel @ +V kABPersonFriendLabel @ +V kABPersonSpouseLabel @ +V kABPersonPartnerLabel @ +V kABPersonManagerLabel @ +V kABPersonAssistantLabel @ + +V kABWorkLabel @ +V kABHomeLabel @ +V kABOtherLabel @ + +f CoreLocation + +V kCLLocationAccuracyBest d +V kCLLocationAccuracyNearestTenMeters d +V kCLLocationAccuracyHundredMeters d +V kCLLocationAccuracyKilometer d +V kCLLocationAccuracyThreeKilometers d + +V kCLDistanceFilterNone d +V kCLHeadingFilterNone d + +C kCLErrorLocationUnknown 0 +C kCLErrorDenied 1 +C kCLErrorNetwork 2 +C kCLErrorHeadingFailure 3 + +V kCLErrorDomain @ + +f CoreData + +C NSUndefinedAttributeType 0 +C NSInteger16AttributeType 100 +C NSInteger32AttributeType 200 +C NSInteger64AttributeType 300 +C NSDecimalAttributeType 400 +C NSDoubleAttributeType 500 +C NSFloatAttributeType 600 +C NSStringAttributeType 700 +C NSBooleanAttributeType 800 +C NSDateAttributeType 900 +C NSBinaryDataAttributeType 1000 +C NSTransformableAttributeType 1800 +C NSObjectIDAttributeType 2000 + +C NSUndefinedEntityMappingType 0x00 +C NSCustomEntityMappingType 0x01 +C NSAddEntityMappingType 0x02 +C NSRemoveEntityMappingType 0x03 +C NSCopyEntityMappingType 0x04 +C NSTransformEntityMappingType 0x05 + +V NSMigrationManagerKey @ +V NSMigrationSourceObjectKey @ +V NSMigrationDestinationObjectKey @ +V NSMigrationEntityMappingKey @ +V NSMigrationPropertyMappingKey @ +V NSMigrationPropertyMappingKey @ + +C NSManagedObjectResultType 0x00 +C NSManagedObjectIDResultType 0x01 +C NSDictionaryResultType 0x02 + +C NSFetchRequestExpressionType 50 + +C NSSnapshotEventUndoInsertion 1<<1 +C NSSnapshotEventUndoDeletion 1<<2 +C NSSnapshotEventUndoUpdate 1<<3 +C NSSnapshotEventRollback 1<<4 +C NSSnapshotEventRefresh 1<<5 +C NSSnapshotEventMergePolicy 1<<6 + +V NSInsertedObjectsKey @ +V NSUpdatedObjectsKey @ +V NSDeletedObjectsKey @ +V NSRefreshedObjectsKey @ +V NSInvalidatedObjectsKey @ +V NSInvalidatedAllObjectsKey @ + +V NSErrorMergePolicy @ +V NSMergeByPropertyStoreTrumpMergePolicy @ +V NSMergeByPropertyObjectTrumpMergePolicy @ +V NSOverwriteMergePolicy @ +V NSRollbackMergePolicy @ + +V NSSQLiteStoreType @ +V NSBinaryStoreType @ +V NSInMemoryStoreType @ + +V NSStoreTypeKey @ +V NSStoreUUIDKey @ + +V NSAddedPersistentStoresKey @ +V NSRemovedPersistentStoresKey @ +V NSUUIDChangedPersistentStoresKey @ + +V NSReadOnlyPersistentStoreOption @ +V NSPersistentStoreTimeoutOption @ +V NSSQLitePragmasOption @ +V NSSQLiteAnalyzeOption @ +V NSSQLiteManualVacuumOption @ + +V NSIgnorePersistentStoreVersioningOption @ +V NSMigratePersistentStoresAutomaticallyOption @ +V NSInferMappingModelAutomaticallyOption @ + +V NSStoreModelVersionHashesKey @ +V NSStoreModelVersionIdentifiersKey @ +V NSPersistentStoreOSCompatibility @ + +C NSNoActionDeleteRule 0 +C NSNullifyDeleteRule 1 +C NSCascadeDeleteRule 2 +C NSDenyDeleteRule 3 + +C NSFetchedResultsChangeInsert 1 +C NSFetchedResultsChangeDelete 2 +C NSFetchedResultsChangeMove 3 +C NSFetchedResultsChangeUpdate 4 + +V NSDetailedErrorsKey @ +V NSValidationObjectErrorKey @ +V NSValidationKeyErrorKey @ +V NSValidationPredicateErrorKey @ +V NSValidationValueErrorKey @ +V NSAffectedStoresErrorKey @ +V NSAffectedObjectsErrorKey @ + +V NSSQLiteErrorDomain @ + +C NSManagedObjectValidationError 1550 +C NSValidationMultipleErrorsError 1560 +C NSValidationMissingMandatoryPropertyError 1570 +C NSValidationRelationshipLacksMinimumCountError 1580 +C NSValidationRelationshipExceedsMaximumCountError 1590 +C NSValidationRelationshipDeniedDeleteError 1600 +C NSValidationNumberTooLargeError 1610 +C NSValidationNumberTooSmallError 1620 +C NSValidationDateTooLateError 1630 +C NSValidationDateTooSoonError 1640 +C NSValidationInvalidDateError 1650 +C NSValidationStringTooLongError 1660 +C NSValidationStringTooShortError 1670 +C NSValidationStringPatternMatchingError 1680 + +C NSManagedObjectContextLockingError 132000 +C NSPersistentStoreCoordinatorLockingError 132010 +C NSManagedObjectReferentialIntegrityError 133000 +C NSManagedObjectExternalRelationshipError 133010 +C NSManagedObjectMergeError 133020 + +C NSPersistentStoreInvalidTypeError 134000 +C NSPersistentStoreTypeMismatchError 134010 +C NSPersistentStoreIncompatibleSchemaError 134020 +C NSPersistentStoreSaveError 134030 +C NSPersistentStoreIncompleteSaveError 134040 +C NSPersistentStoreOperationError 134070 +C NSPersistentStoreOpenError 134080 +C NSPersistentStoreTimeoutError 134090 +C NSPersistentStoreIncompatibleVersionHashError 134100 + +C NSMigrationError 134110 +C NSMigrationCancelledError 134120 +C NSMigrationMissingSourceModelError 134130 +C NSMigrationMissingMappingModelError 134140 +C NSMigrationManagerSourceStoreError 134150 +C NSMigrationManagerDestinationStoreError 134160 +C NSEntityMigrationPolicyError 134170 +C NSInferredMappingModelError 134190 +C NSExternalRecordImportError 134200 + +C NSCoreDataError 134060 +C NSSQLiteError 134180 + +V NSCoreDataVersionNumber d + +C NSCoreDataVersionNumber10_4 46.0 +C NSCoreDataVersionNumber10_4_3 77.0 +C NSCoreDataVersionNumber10_5 185.0 +C NSCoreDataVersionNumber10_5_3 186.0 + +f MapKit + +C MKMapTypeStandard 0 +C MKMapTypeSatellite 1 +C MKMapTypeHybrid 2 + +V MKErrorDomain @ + +C MKErrorUnknown 1 +C MKErrorServerFailure 2 +C MKErrorLoadingThrottled 3 +C MKErrorPlacemarkNotFound 4 + +C MKPinAnnotationColorRed 0 +C MKPinAnnotationColorGreen 1 +C MKPinAnnotationColorPurple 2 + +# MKCoordinateRegionMake +# MKCoordinateRegionMakeWithDistance +# MKCoordinateSpanMake diff --git a/Tweak.mm b/Tweak.mm index 21c91a1..fc7007d 100644 --- a/Tweak.mm +++ b/Tweak.mm @@ -144,10 +144,10 @@ void *operator new [](size_t size, apr_pool_t *pool) { static JSContextRef Context_; -static JSClassRef ffi_; -static JSClassRef joc_; -static JSClassRef ptr_; -static JSClassRef sel_; +static JSClassRef Functor_; +static JSClassRef Instance_; +static JSClassRef Pointer_; +static JSClassRef Selector_; static JSObjectRef Array_; @@ -157,13 +157,15 @@ static JSStringRef length_; static Class NSCFBoolean_; +static NSMutableDictionary *Bridge_; + struct Client { CFHTTPMessageRef message_; CFSocketRef socket_; }; JSObjectRef CYMakeObject(JSContextRef context, id object) { - return JSObjectMake(context, joc_, [object retain]); + return JSObjectMake(context, Instance_, [object retain]); } @interface NSMethodSignature (Cyrver) @@ -175,6 +177,14 @@ JSObjectRef CYMakeObject(JSContextRef context, id object) { - (JSValueRef) cy$JSValueInContext:(JSContextRef)context; @end +@interface NSString (Cyrver) +- (void *) cy$symbol; +@end + +@interface NSNumber (Cyrver) +- (void *) cy$symbol; +@end + @implementation NSObject (Cyrver) - (NSString *) cy$toJSON { @@ -255,6 +265,10 @@ JSObjectRef CYMakeObject(JSContextRef context, id object) { return [self class] != NSCFBoolean_ ? JSValueMakeNumber(context, [self doubleValue]) : JSValueMakeBoolean(context, [self boolValue]); } +- (void *) cy$symbol { + return [self pointerValue]; +} + @end @implementation NSString (Cyrver) @@ -274,6 +288,10 @@ JSObjectRef CYMakeObject(JSContextRef context, id object) { return [reinterpret_cast(json) autorelease]; } +- (void *) cy$symbol { + return dlsym(RTLD_DEFAULT, [self UTF8String]); +} + @end @interface CYJSObject : NSDictionary { @@ -316,7 +334,7 @@ JSContextRef JSGetContext() { void CYThrow(JSContextRef context, JSValueRef value); id CYCastNSObject(JSContextRef context, JSObjectRef object) { - if (JSValueIsObjectOfClass(context, object, joc_)) + if (JSValueIsObjectOfClass(context, object, Instance_)) return reinterpret_cast(JSObjectGetPrivate(object)); JSValueRef exception(NULL); bool array(JSValueIsInstanceOfConstructor(context, object, Array_, &exception)); @@ -586,13 +604,13 @@ static void OnAccept(CFSocketRef socket, CFSocketCallBackType type, CFDataRef ad } } -static JSValueRef joc_getProperty(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef *exception) { +static JSValueRef Instance_getProperty(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef *exception) { return NULL; } typedef id jocData; -static JSObjectRef joc_callAsConstructor(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { _pooled +static JSObjectRef Instance_callAsConstructor(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { _pooled @try { id data(reinterpret_cast(JSObjectGetPrivate(object))); return CYMakeObject(context, [[data alloc] autorelease]); @@ -637,21 +655,42 @@ struct selData : ptrData { } }; -static void ptr_finalize(JSObjectRef object) { +static void Pointer_finalize(JSObjectRef object) { ptrData *data(reinterpret_cast(JSObjectGetPrivate(object))); apr_pool_destroy(data->pool_); } -static void joc_finalize(JSObjectRef object) { +static void Instance_finalize(JSObjectRef object) { id data(reinterpret_cast(JSObjectGetPrivate(object))); [data release]; } -static JSValueRef obc_getProperty(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef *exception) { _pooled - NSString *name([(NSString *) JSStringCopyCFString(kCFAllocatorDefault, propertyName) autorelease]); - if (Class _class = NSClassFromString(name)) - return CYMakeObject(context, _class); - return NULL; +JSObjectRef CYMakeFunction(JSContextRef context, void (*function)(), const char *type) { + ffiData *data(new ffiData(function, type)); + return JSObjectMake(context, Functor_, data); +} + + +JSObjectRef CYMakeFunction(JSContextRef context, void *function, const char *type) { + return CYMakeFunction(context, reinterpret_cast(function), type); +} + +static JSValueRef Global_getProperty(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef *exception) { _pooled + @try { + NSString *string(CYCastNSString(name)); + if (Class _class = NSClassFromString(string)) + return CYMakeObject(context, _class); + if (NSMutableArray *entry = [Bridge_ objectForKey:string]) + switch ([[entry objectAtIndex:0] intValue]) { + case 0: + return CYMakeFunction(context, [string cy$symbol], [[entry objectAtIndex:1] UTF8String]); + case 1: + _assert(false); + case 2: + return JSEvaluateScript(JSGetContext(), CYString([entry objectAtIndex:1]), NULL, NULL, 0, NULL); + } + return NULL; + } CYCatch } void CYSetProperty(JSContextRef context, JSObjectRef object, const char *name, JSValueRef value) { @@ -687,7 +726,7 @@ char *CYPoolCString(apr_pool_t *pool, JSContextRef context, JSValueRef value) { SEL CYCastSEL(JSContextRef context, JSValueRef value) { if (JSValueIsNull(context, value)) return NULL; - else if (JSValueIsObjectOfClass(context, value, sel_)) { + else if (JSValueIsObjectOfClass(context, value, Selector_)) { selData *data(reinterpret_cast(JSObjectGetPrivate((JSObjectRef) value))); return reinterpret_cast(data->value_); } else @@ -702,7 +741,7 @@ void *CYCastPointer(JSContextRef context, JSValueRef value) { return dlsym(RTLD_DEFAULT, CYCastCString(context, value)); case kJSTypeObject: // XXX: maybe support more than just pointers, like ffis and sels - if (JSValueIsObjectOfClass(context, value, ptr_)) { + if (JSValueIsObjectOfClass(context, value, Pointer_)) { ptrData *data(reinterpret_cast(JSObjectGetPrivate((JSObjectRef) value))); return data->value_; } @@ -804,14 +843,14 @@ JSValueRef CYFromFFI(JSContextRef context, sig::Type *type, void *data) { case sig::selector_P: { if (SEL sel = *reinterpret_cast(data)) { selData *data(new selData(sel)); - value = JSObjectMake(context, sel_, data); + value = JSObjectMake(context, Selector_, data); } else value = JSValueMakeNull(context); } break; case sig::pointer_P: { if (void *pointer = *reinterpret_cast(data)) { ptrData *data(new ptrData(pointer)); - value = JSObjectMake(context, ptr_, data); + value = JSObjectMake(context, Pointer_, data); } else value = JSValueMakeNull(context); } break; @@ -918,28 +957,23 @@ static JSValueRef ffi_callAsFunction(JSContextRef context, JSObjectRef object, J return CYCallFunction(context, count, arguments, exception, &data->signature_, &data->cif_, reinterpret_cast(data->value_)); } -JSObjectRef CYMakeFunction(JSContextRef context, void (*function)(), const char *type) { - ffiData *data(new ffiData(function, type)); - return JSObjectMake(context, ffi_, data); -} - JSObjectRef ffi(JSContextRef context, JSObjectRef object, size_t count, const JSValueRef arguments[], JSValueRef *exception) { @try { if (count != 2) [NSException raise:NSInvalidArgumentException format:@"incorrect number of arguments to ffi constructor"]; - void (*function)() = reinterpret_cast(CYCastPointer(context, arguments[0])); + void *function(CYCastPointer(context, arguments[0])); const char *type(CYCastCString(context, arguments[1])); return CYMakeFunction(context, function, type); } CYCatch } -JSValueRef ptr_getProperty_value(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef *exception) { +JSValueRef Pointer_getProperty_value(JSContextRef context, JSObjectRef object, JSStringRef name, JSValueRef *exception) { ptrData *data(reinterpret_cast(JSObjectGetPrivate(object))); return JSValueMakeNumber(context, reinterpret_cast(data->value_)); } -static JSStaticValue ptr_staticValues[2] = { - {"value", &ptr_getProperty_value, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete}, +static JSStaticValue Pointer_staticValues[2] = { + {"value", &Pointer_getProperty_value, NULL, kJSPropertyAttributeReadOnly | kJSPropertyAttributeDontDelete}, {NULL, NULL, NULL, 0} }; @@ -970,128 +1004,43 @@ MSInitialize { _pooled JSClassDefinition definition; definition = kJSClassDefinitionEmpty; - definition.getProperty = &obc_getProperty; - JSClassRef obc(JSClassCreate(&definition)); + definition.className = "Pointer"; + definition.staticValues = Pointer_staticValues; + definition.finalize = &Pointer_finalize; + Pointer_ = JSClassCreate(&definition); definition = kJSClassDefinitionEmpty; - definition.className = "ptr"; - definition.staticValues = ptr_staticValues; - definition.finalize = &ptr_finalize; - ptr_ = JSClassCreate(&definition); + definition.className = "Functor"; + definition.parentClass = Pointer_; + definition.callAsFunction = &ffi_callAsFunction; + Functor_ = JSClassCreate(&definition); definition = kJSClassDefinitionEmpty; - definition.className = "ffi"; - definition.parentClass = ptr_; - definition.callAsFunction = &ffi_callAsFunction; - ffi_ = JSClassCreate(&definition); + definition.className = "Selector"; + definition.parentClass = Pointer_; + Selector_ = JSClassCreate(&definition); definition = kJSClassDefinitionEmpty; - definition.className = "sel"; - definition.parentClass = ptr_; - sel_ = JSClassCreate(&definition); + definition.className = "Instance_"; + definition.getProperty = &Instance_getProperty; + definition.callAsConstructor = &Instance_callAsConstructor; + definition.finalize = &Instance_finalize; + Instance_ = JSClassCreate(&definition); definition = kJSClassDefinitionEmpty; - definition.className = "joc"; - definition.getProperty = &joc_getProperty; - definition.callAsConstructor = &joc_callAsConstructor; - definition.finalize = &joc_finalize; - joc_ = JSClassCreate(&definition); + definition.getProperty = &Global_getProperty; + JSClassRef Global(JSClassCreate(&definition)); - JSContextRef context(JSGlobalContextCreate(obc)); + JSContextRef context(JSGlobalContextCreate(Global)); Context_ = context; JSObjectRef global(JSContextGetGlobalObject(context)); - CYSetProperty(context, global, "ffi", JSObjectMakeConstructor(context, ffi_, &ffi)); - CYSetProperty(context, global, "obc", JSObjectMake(context, obc, NULL)); - -#define CYSetFunction_(name, type) \ - CYSetProperty(context, global, #name, CYMakeFunction(context, reinterpret_cast(&name), type)) - - CYSetFunction_(class_addIvar, "B#*LC*"); - CYSetFunction_(class_addMethod, "B#:^?*"); - CYSetFunction_(class_addProtocol, "B#@"); - CYSetFunction_(class_conformsToProtocol, "B#@"); - CYSetFunction_(class_copyIvarList, "^^{objc_ivar=}#^I"); - CYSetFunction_(class_copyMethodList, "^^{objc_method=}#^I"); - CYSetFunction_(class_copyPropertyList, "^^{objc_property=}#^I"); - CYSetFunction_(class_copyProtocolList, "^@#^I"); - CYSetFunction_(class_createInstance, "@#L"); - CYSetFunction_(class_getClassMethod, "^{objc_method=}#:"); - CYSetFunction_(class_getClassVariable, "^{objc_ivar=}#*"); - CYSetFunction_(class_getInstanceMethod, "^{objc_method=}#:"); - CYSetFunction_(class_getInstanceSize, "L#"); - CYSetFunction_(class_getInstanceVariable, "^{objc_ivar=}#*"); - CYSetFunction_(class_getIvarLayout, "*#"); - CYSetFunction_(class_getMethodImplementation, "^?#:"); - CYSetFunction_(class_getMethodImplementation_stret, "^?#:"); - CYSetFunction_(class_getName, "*#"); - CYSetFunction_(class_getProperty, "^{objc_property=}#*"); - CYSetFunction_(class_getSuperclass, "##"); - CYSetFunction_(class_getVersion, "i#"); - CYSetFunction_(class_getWeakIvarLayout, "*#"); - CYSetFunction_(class_isMetaClass, "B#"); - CYSetFunction_(class_replaceMethod, "^?#:^?*"); - CYSetFunction_(class_respondsToSelector, "B#:"); - CYSetFunction_(class_setIvarLayout, "v#*"); - CYSetFunction_(class_setSuperclass, "###"); - CYSetFunction_(class_setVersion, "v#i"); - CYSetFunction_(class_setWeakIvarLayout, "v#*"); - CYSetFunction_(ivar_getName, "*^{objc_ivar=}"); - CYSetFunction_(ivar_getOffset, "i^{objc_ivar=}"); - CYSetFunction_(ivar_getTypeEncoding, "*^{objc_ivar=}"); - CYSetFunction_(method_copyArgumentType, "^c^{objc_method=}I"); - CYSetFunction_(method_copyReturnType, "^c^{objc_method=}"); - CYSetFunction_(method_exchangeImplementations, "v^{objc_method=}^{objc_method=}"); - CYSetFunction_(method_getArgumentType, "v^{objc_method=}I^cL"); - CYSetFunction_(method_getImplementation, "^?^{objc_method=}"); - CYSetFunction_(method_getName, ":^{objc_method=}"); - CYSetFunction_(method_getNumberOfArguments, "I^{objc_method=}"); - CYSetFunction_(method_getReturnType, "v^{objc_method=}^cL"); - CYSetFunction_(method_getTypeEncoding, "*^{objc_method=}"); - CYSetFunction_(method_setImplementation, "^?^{objc_method=}^?"); - CYSetFunction_(objc_allocateClassPair, "##*L"); - CYSetFunction_(objc_copyProtocolList, "^@^I"); - CYSetFunction_(objc_duplicateClass, "##*L"); - CYSetFunction_(objc_getClass, "#*"); - CYSetFunction_(objc_getClassList, "i^#i"); - CYSetFunction_(objc_getFutureClass, "#*"); - CYSetFunction_(objc_getMetaClass, "@*"); - CYSetFunction_(objc_getProtocol, "@*"); - CYSetFunction_(objc_getRequiredClass, "@*"); - CYSetFunction_(objc_lookUpClass, "@*"); - CYSetFunction_(objc_registerClassPair, "v#"); - CYSetFunction_(objc_setFutureClass, "v#*"); - CYSetFunction_(object_copy, "@@L"); - CYSetFunction_(object_dispose, "@@"); - CYSetFunction_(object_getClass, "#@"); - CYSetFunction_(object_getClassName, "*@"); - CYSetFunction_(object_getIndexedIvars, "^v@"); - CYSetFunction_(object_getInstanceVariable, "^{objc_ivar=}@*^^v"); - CYSetFunction_(object_getIvar, "@@^{objc_ivar=}"); - CYSetFunction_(object_setClass, "#@#"); - CYSetFunction_(object_setInstanceVariable, "^{objc_ivar=}@*^v"); - CYSetFunction_(object_setIvar, "v@^{objc_ivar=}@"); - CYSetFunction_(property_getAttributes, "*^{objc_property=}"); - CYSetFunction_(property_getName, "*^{objc_property=}"); - CYSetFunction_(protocol_conformsToProtocol, "B@@"); - CYSetFunction_(protocol_copyMethodDescriptionList, "^{objc_method_description=:*}@BB^I"); - CYSetFunction_(protocol_copyPropertyList, "^{objc_property=}@^I"); - CYSetFunction_(protocol_copyProtocolList, "^@@^I"); - CYSetFunction_(protocol_getMethodDescription, "{objc_method_description=:*}@:BB"); - CYSetFunction_(protocol_getName, "*@"); - CYSetFunction_(protocol_getProperty, "^{objc_property=}@*BB"); - CYSetFunction_(protocol_isEqual, "B@@"); - CYSetFunction_(sel_getName, "*:"); - CYSetFunction_(sel_getUid, ":*"); - CYSetFunction_(sel_isEqual, "B::"); - CYSetFunction_(sel_registerName, ":*"); + CYSetProperty(context, global, "ffi", JSObjectMakeConstructor(context, Functor_, &ffi)); CYSetProperty(context, global, "objc_msgSend", JSObjectMakeFunctionWithCallback(context, CYString("objc_msgSend"), &$objc_msgSend)); - CYSetProperty(context, global, "YES", JSValueMakeBoolean(context, true)); - CYSetProperty(context, global, "NO", JSValueMakeBoolean(context, false)); - CYSetProperty(context, global, "nil", JSValueMakeNull(context)); + Bridge_ = [[NSMutableDictionary dictionaryWithContentsOfFile:@"/usr/lib/libcyrver.plist"] retain]; name_ = JSStringCreateWithUTF8CString("name"); message_ = JSStringCreateWithUTF8CString("message"); diff --git a/makefile b/makefile index 44701db..024cd30 100644 --- a/makefile +++ b/makefile @@ -12,11 +12,23 @@ menes := $(shell cd ~; pwd)/menes link := -framework CoreFoundation -framework Foundation -F${PKG_ROOT}/System/Library/PrivateFrameworks -L$(menes)/mobilesubstrate -lsubstrate -lapr-1 -lffi -all: $(name).dylib $(control) +all: cyrver $(name).dylib libcyrver.plist clean: rm -f $(name).dylib +libcyrver.plist: Bridge.def makefile + sed -e 's/^F/0/;s/^V/1/;s/^C/2/' Bridge.def | while read -r line; do \ + if [[ $$line == '' ]]; then \ + continue; \ + fi; \ + set $$line; \ + if [[ $$1 =~ [#fl] ]]; then \ + continue; \ + fi; \ + echo "$$2 = ($$1, \"$$3\");"; \ + done >$@ + Struct.hpp: $$($(target)gcc -print-prog-name=cc1obj) -print-objc-runtime-info $@ @@ -27,8 +39,8 @@ $(name).dylib: Tweak.mm makefile $(menes)/mobilesubstrate/substrate.h sig/*.[ch] package: all rm -rf package mkdir -p package/DEBIAN + cp -a control package/DEBIAN mkdir -p package/Library/MobileSubstrate/DynamicLibraries - cp -a control $(control) package/DEBIAN if [[ -e Settings.plist ]]; then \ mkdir -p package/Library/PreferenceLoader/Preferences; \ cp -a Settings.png package/Library/PreferenceLoader/Preferences/$(name)Icon.png; \ @@ -36,23 +48,14 @@ package: all fi if [[ -e Tweak.plist ]]; then cp -a Tweak.plist package/Library/MobileSubstrate/DynamicLibraries/$(name).plist; fi cp -a $(name).dylib package/Library/MobileSubstrate/DynamicLibraries - $(MAKE) extra - dpkg-deb -b package $(shell grep ^Package: control | cut -d ' ' -f 2-)_$(shell grep ^Version: control | cut -d ' ' -f 2)_iphoneos-arm.deb - -extra: - -%: %.mm - $(target)g++ -o $@ -Wall -Werror $< -lobjc -framework CoreFoundation -framework Foundation - -.PHONY: all clean extra package - -all: cyrver - -extra: mkdir -p package/usr/{bin,lib} mv package/Library/MobileSubstrate/DynamicLibraries/Cyrver.dylib package/usr/lib/libcyrver.dylib ln -s /usr/lib/libcyrver.dylib package/Library/MobileSubstrate/DynamicLibraries/Cyrver.dylib cp -a cyrver package/usr/bin + cp -a libcyrver.plist package/usr/lib + dpkg-deb -b package $(shell grep ^Package: control | cut -d ' ' -f 2-)_$(shell grep ^Version: control | cut -d ' ' -f 2)_iphoneos-arm.deb + +.PHONY: all clean extra package cyrver: Application.mm Cyrver.dylib $(target)g++ -g0 -O2 -Wall -Werror -o $@ $(filter %.mm,$^) -framework UIKit -framework Foundation -framework CoreFoundation -lobjc Cyrver.dylib -framework JavaScriptCore -F${PKG_ROOT}/System/Library/PrivateFrameworks -- 2.49.0