So the example I used here was just for the sake of understanding how ref 
and struct work.  I think I get it now.

Now I started all this because I wanted to create FFI bindings to libpst 
(http://www.five-ten-sg.com/libpst/).  I started by creating all the 
necessary structs and made a call to the first function which opens the 
.PST file (outlook personal file), followed by calls to create the indexes. 
 The basic members of the struct are populated fine, however the nested 
structs are not.  They come back with strange memory addresses 
which obviously cause seg fault when I try to access them.

The main code is here 
https://github.com/rhasson/node-libpst/blob/master/ffi_nodepst.js#L1153-L1175 
scrolling to the top of the source you will see all the struct declarations.

Here is the output of GDB:

(gdb) run
Starting program: /usr/local/bin/node ffi_nodepst.js
Reading symbols for shared libraries 
++++.........................................................................................................................................
 
done
Reading symbols for shared libraries . done
Reading symbols for shared libraries . done
Reading symbols for shared libraries . done
File outlook.pst was opened successfully  //outlook.pst is the file I'm 
opening and is populated within the pst_file struct and returned correctly
Loading index...
index ret:  0  //0 means that the indexes were loaded correctly, however 
here is where the nested structs are malloced and populated by the library
Loading extended attributes...
extended ret:  1  //1 means that the extended attributes where loaded 
correctly, again I can't access them
f:  { _pointer: <Buffer@0x1010644f0 a0 30 69 75 ff 7f 00 00 00 14 81 02 01 
00 00 00 d0 04 20 02 01 00 00 00 00 00 00 00 00 00 00 00 90 0d 20 02 01 00 
00 00 30 12 20 02 01 00 00 00 60 12 20 ...> }
i_head:  false  //this is just a ref.isNull() test on each of the nested 
structs
i_tail:  false
d_head:  false
d_tail:  false
x_head:  false
block_head:  false

Program received signal EXC_BAD_ACCESS, Could not access memory.   //here I 
try to do f.i_head.deref() which fails since the memory location is not 
valid, but I can't figure out why.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000007600
0x0000000100167dcc in 
v8::internal::ElementsAccessorBase<v8::internal::ExternalUnsignedByteElementsAccessor,
 
v8::internal::ElementsKindTraits<(v8::internal::ElementsKind)9> >::Get ()
(gdb) 


On Wednesday, September 5, 2012 5:12:55 PM UTC-4, Nathan Rajlich wrote:
>
> Glad you're figuring it out on your own :p 
>
> I don't get your latest question: you're already passing a struct in 
> by reference in the setT() function so I'm not sure what's different. 
>
> On Wed, Sep 5, 2012 at 1:44 PM, rhasson <rha...@gmail.com <javascript:>> 
> wrote: 
> > Now, the issue I'm having is in trying to port this methodology to an 
> > external library out of my control (libpst) which does not use malloc on 
> > local structs that then have pointers assigned to the main struct that 
> was 
> > passed in by reference which are then overwritten.  Is there a way to 
> > address this using node-ref and node-struct ? 
> > 
> > 
> > On Wednesday, September 5, 2012 1:09:48 AM UTC-4, rhasson wrote: 
> >> 
> >> Nate, 
> >> 
> >> I'm back with some more questions about node-struct and handling nested 
> >> structures. 
> >> 
> >> In the example below, I created one simple struct with a single Int and 
> >> another struct with an Int and a pointer to the first struct. 
> >> What I noticed is that I can't access the int inside the nested 
> structure. 
> >> Another thing I noticed is that if I do something like this: 
> >> var myStruct = Struct(); 
> >> myStruct.defineProperty('someProp', ref.refType('int')); 
> >> 
> >> var t = new myStruct(); 
> >> 
> >> accessing t.someProp fails.  If I change the definition above to 
> >> ('someProp', ref.types.int), I can access t.someProp with no problem. 
> >> 
> >> Why is this and how to deal with this? 
> >> 
> >> Below you can see I'm running into the same issue, however since I'm 
> >> defining the property is a refType(struct_one) I can't figure out how 
> to 
> >> access its propertied.  It seems like it's an unrecognized type. 
> >> 
> >> I have this .js file: 
> >> 
> >> var ffi = require('ffi'); 
> >> var ref = require('ref'); 
> >> var Struct = require('ref-struct'); 
> >> 
> >> //define a simple struct 
> >> var t = Struct({ 
> >>   't_i': 'int' 
> >> }); 
> >> 
> >> //define a second stuct with a pointer to an instance of the first 
> struct 
> >> var f = new Struct(); 
> >>   f.defineProperty('fp_i', ref.types.int); 
> >>   f.defineProperty('t_p', ref.refType(t)); 
> >> 
> >> var tPtr = ref.refType(t); 
> >> var fPtr = ref.refType(f); 
> >> 
> >> var lib = './libffi.so.1.0.1'; 
> >> 
> >> var l = ffi.Library(lib, { 
> >>         'setT': ['void', [fPtr]] 
> >>         }); 
> >> 
> >> var _f = new f(); 
> >> var x = null, d = null; 
> >> console.log(_f);  //I see the buffer that's created 
> >> l.setT(_f.ref()); 
> >> 
> >> console.log(_f);  //I see the updated buffer 
> >> 
> >> console.log('fp_i: ', _f.fp_i);  //works great, returns the expected 
> value 
> >> 
> >> console.log('t_i: ', _f.t_p.t_i); //this is undefined, not sure how to 
> >> access the nested struct's members. 
> >> 
> >> My .c file looks like this: 
> >> 
> >> #include <stdio.h> 
> >> #include <string.h> 
> >> 
> >> typedef struct t { 
> >>   int t_i; 
> >> } t; 
> >> 
> >> typedef struct f { 
> >>   int fp_i; 
> >>   struct t *t_p; 
> >> } f; 
> >> 
> >> void setT(f *i) { 
> >>   t *tt; 
> >> 
> >>   i->fp_i = 5; 
> >>   tt->t_i = 6; 
> >>   i->t_p = tt; 
> >>   printf("\tThis is a test: %i\n", i->t_p->t_i);  //successfully prints 
> 6 
> >> } 
> >> 
> >> void main(){} 
> >> 
> >> 
> > -- 
> > Job Board: http://jobs.nodejs.org/ 
> > Posting guidelines: 
> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines 
> > You received this message because you are subscribed to the Google 
> > Groups "nodejs" group. 
> > To post to this group, send email to nod...@googlegroups.com<javascript:> 
> > To unsubscribe from this group, send email to 
> > nodejs+un...@googlegroups.com <javascript:> 
> > For more options, visit this group at 
> > http://groups.google.com/group/nodejs?hl=en?hl=en 
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to