• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag
 

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: NSNumber : method to return pointer to represented value
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: NSNumber : method to return pointer to represented value


  • Subject: Re: NSNumber : method to return pointer to represented value
  • From: "email@hidden" <email@hidden>
  • Date: Sat, 22 Feb 2014 07:44:52 +0000

On 22 Feb 2014, at 00:12, Ken Thomases <email@hidden> wrote:

> On Feb 21, 2014, at 3:17 PM, email@hidden wrote:
>
>> So I want to be able to send the same message to any class and get an appropriate void* pointer.
>
> There's no one representation of its content, so there's no way for any recipient of a supposed "pointer to that content" (however that might be obtained) to interpret the pointer.
Not so.
The pointer is ultimately passed as a vararg along with a Mono method representation as part of a Mono method invocation.
The Mono method representation includes type info for its parameters.
Hence it can cast and deference a void* pointer appropriately.

This method is used to query C#/CLR Dictionary <TKey, TValue> for a given key using the embedded MONO C API:

 - (BOOL)containsKey:(id)key
{
    BOOL containsKey = NO;

    // TODO: use -confromsToProtocol?
    if ([key respondsToSelector:@selector(monoObject)] && [key respondsToSelector:@selector(monoValue)]) {

        // form the method name
        NSString *monoArgumentTypeName = [[DBTypeManager sharedManager] monoArgumentTypeNameForMonoObject:[key monoObject]];
        NSString *methodName = [NSString stringWithFormat:@"ContainsKey(%@)", monoArgumentTypeName];

        // invoke the method
        MonoObject *monoObject = [self invokeMonoMethod:[methodName UTF8String] withNumArgs:1, [key monoValue]];
        containsKey = DB_UNBOX_BOOLEAN(monoObject);
    } else {
        [NSException raise:@"Invalid key" format:@"Key %@ must respond to -monoObject and -monoValue", key];
    }

    return containsKey;
}

- (MonoObject *)invokeMonoMethod:(const char *)methodName withNumArgs:(int)numArgs, ... {
	va_list va_args;
	va_start(va_args, numArgs);

	MonoObject *ret = DBMonoObjectInvoke(_monoObj, methodName, numArgs, va_args);

	va_end(va_args);

	return ret;
}

In the above if key is an NSNumber containing a 5 then  [key monoValue] returns a pointer to a 5.
If the key is an NSString then  [key monoValue] returns a pointer to a monoObject representing the string.

>
> If you have some specific representation in mind, then don't use NSNumber.  Use a custom class wrapping the specific representation you want to use.
The custom class would simply be a dupe of NSNUmber + 1 method.
My original category solution seems simpler.
>
>
>> This usage pattern, within a generated code environment too, makes the imposition of an lvalue that I can take an address from undesirable.
>
> However undesirable it may be, it's a consequence of you wanting an address for things which don't have an address.  The thing has to be stored, at least temporarily, in storage which has a proper address (and a predictable size and semantic interpretation).
This is what the code in my OP does.

>
>> Plus it also needs to be an NSNumber, not a custom NSObject subclass.
>
> Why?
I am not in control of the types on which I have to operate.

>
> If you really, really want to try to do this _and_ you can pick a single in-memory representation for all NSNumber content values, you could do something similar to what NSString does for -UTF8String.  You'll notice that that method's returned string has the lifetime of an autoreleased object, not the original string object.  I believe that it just creates an autoreleased NSData holding the UTF-8-encoded bytes and returns that NSData's -bytes.  So, you'd do something like:
I think the code in the OP does this.

Thanks for looking

Jonathan
_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


  • Follow-Ups:
    • Re: NSNumber : method to return pointer to represented value
      • From: Jens Alfke <email@hidden>
    • Re: NSNumber : method to return pointer to represented value
      • From: Ken Thomases <email@hidden>
References: 
 >NSNumber : method to return pointer to represented value (From: "email@hidden" <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: Fritz Anderson <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: "email@hidden" <email@hidden>)
 >Re: NSNumber : method to return pointer to represented value (From: Ken Thomases <email@hidden>)

  • Prev by Date: Re: Disabling screen capture
  • Next by Date: Re: NSNumber : method to return pointer to represented value
  • Previous by thread: Re: NSNumber : method to return pointer to represented value
  • Next by thread: Re: NSNumber : method to return pointer to represented value
  • Index(es):
    • Date
    • Thread