On Sun, Oct 24, 2010 at 00:47, Marco Rogers <[email protected]> wrote: > Okay so does this mean that if you actually pass the handle back to js space > then it does become eligible for GC? What you set it to a property of an > object from js space?
I don't think so. I built a test program which did just that. 1. Created a function in C-land, 2. Exposed it to a v8 script 3. Ran the script which called the function After hitting 1GB res. memory, none of the million instances had been released (yes, I yielded to v8 "IdleNotification" so GC could take place). I think you need to _create_ the instance in js-land for it to be subject to GC. If you define your own function type using FunctionTemplate and providing a custom initializer (usually a Handle<Value> New(const Arguments& args)), then when such an object is created in js-land, |args.Holder()| will contain an object which has been allocated by v8 and should be subject to GC. The problem seems to arise when _you_ create the "Holder" object. > I've been using the v8 API for a while now and I understand the basics (and > a bit more). I'm just trying to make sure I understand this particular > gotcha and how to avoid it. Same thing here. Would really appreciate some clarification from someone into v8 core dev. :) > > :Marco > > On Sat, Oct 23, 2010 at 6:40 PM, Rasmus Andersson <[email protected]> wrote: >> >> On Sat, Oct 23, 2010 at 23:41, Marco Rogers <[email protected]> >> wrote: >> > Anton, what do you mean by "API functions.."? Which part of his above >> > example are you referring to? I admit I'm still not sure what's wrong >> > with what Rasmus is doing. >> >> I believe what Anton is saying is that an object created in C-land >> will not be subject to GC. >> >> Here, we create (i.e. allocate) a Function object using the C++ API: >> >> HandleScope scope; >> Local<Function> fun = Local<Function>::New(...); >> Persistent<Function> phandle = Persistent<Function>::New(fun); >> phandle.MakeWeak(data, &FinalizationCallback) >> >> If I understand Anton correctly, this function will never be garbage >> collected thus FinalizationCallback never called. Anton, is that >> correct? >> >> And the case v8 create the object for us: >> >> HandleScope scope; >> Local<Value> v = EvalHelper("function(){}"); >> Local<Function> fun = Local<Function>::Cast(v); >> Persistent<Function> phandle = Persistent<Function>::New(fun); >> phandle.MakeWeak(data, &FinalizationCallback) >> >> But in this case FinalizationCallback will be called. >> >> Is this correct? >> >> > > -- > Marco Rogers > [email protected] > > Life is ten percent what happens to you and ninety percent how you respond > to it. > - Lou Holtz > > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users -- Rasmus Andersson -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
