Thank you for the quick response. Yes, I see where you're going. I did some 
testing and it actually works.

Thanks for the tip!
Danny

On Monday, February 17, 2014 12:43:42 PM UTC+2, Ben Noordhuis wrote:
>
> On Mon, Feb 17, 2014 at 10:51 AM, Danny Dorfman 
> <[email protected]<javascript:>> 
> wrote: 
> > Hello there, 
> > 
> > I have a piece of native C++ code that creates "special" objects. 
> Objects, 
> > that behave differently under certain conditions. 
> > My question is, how to make these special objects resume their normal 
> > functionality. I need something that says (in pseudo-code) 
> > 
> > Getter() { 
> >   if (my condition) { 
> >      return a specially calculated value  / I know how to do this / 
> >   } else 
> >      return the regular JS value    / How do I do this? / 
> >  } 
> > } 
> > Setter() { 
> >   if (my condition) { 
> >      cause a special side effect  / I know how to do this / 
> >   } else 
> >      set the regular JS value     / How do I do this? / 
> >  } 
> > } 
> > 
> > 
> > Here is a sample code I've written to investigate this issue (based on 
> > "hello world"). 
> > 
> >   1 #include <v8.h> 
> >   2 #include <stdio.h> 
> >   3 using namespace v8; 
> >   4 
> >   5 void GetAlfa(Local<String> property, const 
> PropertyCallbackInfo<Value>& 
> > info) 
> >   6 { 
> >   7 } 
> >   8 void SetAlfa(Local<String> property, Local<Value> value, const 
> > PropertyCallbackInfo<void>& info) 
> >   9 { 
> >  10 } 
> >  11 
> >  12 int main(int argc, char* argv[]) { 
> >  13   Isolate* isolate = Isolate::GetCurrent(); 
> >  14   HandleScope handle_scope(isolate); 
> >  15   Handle<Context> context = Context::New(isolate); 
> >  16   Context::Scope context_scope(context); 
> >  17   Handle<ObjectTemplate> specific_templ = ObjectTemplate::New(); 
> >  18   specific_templ->SetAccessor(String::New("alfa"), GetAlfa, 
> SetAlfa); 
> >  19   Handle<Object> specific_obj = specific_templ->NewInstance(); 
> >  20   context->Global()->Set(String::New("specific"), specific_obj); 
> >  21   Handle<String> source = String::New("specific.alfa=7; 
> specific.alfa"); 
> >  22   Handle<Script> script = Script::Compile(source); 
> >  23   Handle<Value> result = script->Run(); 
> >  24   String::AsciiValue ascii(result); 
> >  25   printf("%s\n", *ascii); 
> >  26   return 0; 
> >  27 } 
> > 
> > 
> > Currently the code returns "undefined". Is there a way to make it return 
> "7" 
> > without removing the getter and setter, and without going to External or 
> > static storage? 
> > I did some primitive testing, and ended up in infinite get- or 
> set-loops. 
> > 
> > Regards, 
> > Danny 
>
> You can pass a Handle<Value> as the fourth argument to SetAccessor() 
> that you can retrieve in the callback with info.Data(). 
>
> In your main program, pass in a Handle<Object>, maintain a 
> Persistent<Object> reference to the object and update a state field 
> when appropriate.  In your callback, cast the return value of 
> info.Data() to Handle<Object>, check the state field and act 
> accordingly. 
>
> Your accessor is a property of the ObjectTemplate so changes to the 
> state object will affect all instances.  If that's an issue, move the 
> accessor to the actual instance.  Hope that helps. 
>

-- 
-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users
--- 
You received this message because you are subscribed to the Google Groups 
"v8-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to