I did that, Sill assert. Thanks for your patient. Any more suggestion?  It
pushes me crazy.
actually source never run into handle_weak () function.


On Mon, Dec 26, 2011 at 8:46 PM, Vyacheslav Egorov <[email protected]>wrote:

> Your weak callback (handle_weak) is empty and does not follow the contract.
>
> Put object.Dispose(); there.
>
> --
> Vyacheslav Egorov
>
>
> On Mon, Dec 26, 2011 at 12:55 PM, D C <[email protected]> wrote:
>
>> Hi:
>>   Thanks for you replay, I modify my source according to your words,
>> It seems not work.
>> here is my source snippet:
>>
>> void javascript_ctx_impl::call_obj_func (v8::persistent<object>
>> object, const char* method, int argc, handle<value> argv[])
>> {
>>    handlescope handle_scope;
>>
>>    local<value> cb = object->get(string::new(method));
>>
>>    if (!cb->isfunction()) {
>>        std::cerr << "method = " << method << std::endl;
>>                return;
>>    }
>>
>>    local<function> do_action = local<function>::cast(cb);
>>
>>    trycatch try_catch;
>>     /*********** ASSERT HERE ******************/
>>     /*********** ASSERT HERE ******************/
>>     /*********** ASSERT HERE ******************/
>>    do_action->call(object, argc, argv);
>>     /*********** ASSERT HERE ******************/
>>     /*********** ASSERT HERE ******************/
>>     /*********** ASSERT HERE ******************/
>>    if (try_catch.hascaught()) {
>>                v8::local<v8::message> msg = try_catch.message ();
>>        if (!msg->getscriptresourcename().isempty() && !msg-
>> >getscriptresourcename()->isundefined())
>>        {
>>            v8::string::asciivalue name (msg-
>> >getscriptresourcename());
>>            std::cerr << *name << std::endl;
>>        }
>>        else {
>>            std::cerr << "call_obj_func: runtime error." << std::endl;
>>        }
>>    }
>> }
>>
>> template <typename T>
>> class write_handle : public handle_impl_base
>> {
>>    public:
>>                write_handle (boost::asio::io_service& io,
>> v8::Persistent<Object>
>> local,
>>                v8::Persistent<Object> h
>>                )
>>                : handle_impl_base (io), handle_ (h), session_ (local)
>>                {
>>        }
>>    public:
>>        void operator () (const boost::system::error_code& ec,
>> std::size_t bytes_transferred)
>>        {
>>            HandleScope handle_scope;
>>            if (!ec) {
>>                Handle<Value> args[3] = {
>>                    js::instance ().safe_new_value (session_),
>>                                        js::instance ().safe_new_value
>> ("TRUE"),
>>                                        js::instance ().safe_new_value
>> (bytes_transferred)
>>                };
>>
>>                                js::instance ().call_obj_func (handle_,
>> "onHandle", 3, args);
>>            }
>>            else {
>>                Handle<Value> args[3] = {
>>                    js::instance ().safe_new_value (session_),
>>                                        js::instance ().safe_new_value
>> ("FALSE"),
>>                                        js::instance ().safe_new_value
>> (bytes_transferred)
>>                };
>>                                js::instance ().call_obj_func (handle_,
>> "onHandle", 3, args);
>>            }
>>            handle_.Dispose (); session_.Dispose ();
>>        }
>>        static void handle_weak (Persistent<Value> object, void*
>> parameter)
>>        {
>>        }
>>    private:
>>        v8::Persistent<Object> handle_;
>>        v8::Persistent<Object> session_;
>> };
>>
>> v8::Handle<v8::Value> js_asio_socket_ip_tcp_function::async_write
>> (const v8::Arguments& args)
>> {
>>    HandleScope hScope;
>>    js_asio_socket_ip_tcp_function* native_obj =
>> unwrap<js_asio_socket_ip_tcp_function>(args.This());
>>
>>    if (args.Length () < 4) {
>>        return ThrowException (Exception::TypeError(String::New(
>>                        "async_resolve need 4 parameters."))
>>                );
>>    }
>>    /** Argument check here */
>>    js_stream_function* s = unwrap<js_stream_function> (args[1]-
>> >ToObject ());
>>    if (s == NULL) {
>>        return ThrowException (Exception::TypeError(String::New(
>>                        "async_resolve parameter 2 error."))
>>                );
>>    }
>>
>>    v8::Local<v8::Object>  p0 = args[0]->ToObject ();
>>    v8::Local<v8::Integer> p2 = args[2]->ToUint32 ();
>>
>>    v8::Persistent<Object> handle;
>>    v8::Persistent<Object> sessin;
>>
>>    if (args[3]->ToObject ()->IsFunction ()) {
>>        v8::Local<v8::Function> f = v8::Local<v8::Function>::Cast(args
>> [3]->ToObject());
>>        handle = v8::Persistent<v8::Object>::New(f);
>>    }
>>    else {
>>        handle = v8::Persistent<Object>::New (args[3]->ToObject ());
>>    }
>>
>>    handle.MakeWeak (NULL, write_handle<void>::handle_weak);
>>    handle.MarkIndependent ();
>>
>>    sessin = v8::Persistent<Object>::New (p0);
>>    boost::asio::async_write (*(native_obj->socket_),
>>            boost::asio::buffer (s->get (), p2->Value ()),
>>            boost::asio::transfer_all (),
>>            make_concrete_handle (write_handle <void> (native_obj-
>> >socket_->get_io_service (), sessin, handle)
>>                )
>>            );
>>    return v8::Undefined ();
>> }
>>
>> if you have some suggestion, it will be very thankful.
>>
>>
>> On 12月26日, 午前8:15, Vyacheslav Egorov <[email protected]> wrote:
>> > Every weak callback should either revive (via ClearWeak or MakeWeak) or
>> > destroy (via Dispose) the handle for which it was called. This contract
>> is
>> > described in v8.h, see the comment above WeakReferenceCallback
>> definition.
>> >
>> > You have a callback that does not follow this contract.
>> >
>> > --
>> > Vyacheslav Egorov
>> > On Dec 25, 2011 3:41 PM, "D C" <[email protected]> wrote:
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > > Hi all:
>> > > I stuck here for about two weeks.
>> > > Here is my stack trace.
>> > >
>> =========================================================================
>> > >        Agent.exe!v8::internal::OS::DebugBreak()  Line 930      C++
>> > >        Agent.exe!v8::internal::OS::Abort()  Line 925   C++
>> > >        Agent.exe!V8_Fatal(const char * file=0x00d8fcd8, int line=237,
>> const
>> > > char * format=0x00d7bd18, ...)  Line 59 C++
>> > >        Agent.exe!CheckHelper(const char * file=0x00d8fcd8, int
>> line=237,
>> > > const char * source=0x00d8fe34, bool condition=false)  Line 60 + 0x16
>> > > bytes   C++
>> >
>> > >
>> Agent.exe!v8::internal::GlobalHandles::Node::PostGarbageCollectionProcessin
>> g(v8::internal::Isolate
>> > > * isolate=0x014b0068, v8::internal::GlobalHandles *
>> > > global_handles=0x003ef478)  Line 237 + 0x27 bytes        C++
>> > >        Agent.exe!
>> >
>> > >
>> v8::internal::GlobalHandles::PostGarbageCollectionProcessing(v8::internal::
>> GarbageCollector
>> > > collector=SCAVENGER)  Line 540 + 0x12 bytes     C++
>> > >        Agent.exe!
>> > >
>> v8::internal::Heap::PerformGarbageCollection(v8::internal::GarbageCollector
>> > > collector=SCAVENGER, v8::internal::GCTracer * tracer=0x0012e0b4)  Line
>> > > 822 + 0x15 bytes        C++
>> > >        Agent.exe!
>> > > v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace
>> > > space=NEW_SPACE, v8::internal::GarbageCollector collector=SCAVENGER)
>> > > Line 518 + 0x16 bytes   C++
>> > >        Agent.exe!
>> > > v8::internal::Heap::CollectGarbage(v8::internal::AllocationSpace
>> > > space=NEW_SPACE)  Line 443      C++
>> > >        Agent.exe!
>> > > v8::internal::Factory::NewStringFromUtf8(v8::internal::Vector<char
>> > > const > string={...}, v8::internal::PretenureFlag
>> > > pretenure=NOT_TENURED)  Line 186 + 0xea bytes   C++
>> > >        Agent.exe!v8::String::New(const char * data=0x00d68254, int
>> > > length=8)  Line 4410    C++
>> > >
>>  Agent.exe!javascript_ctx_impl::call_obj_func(v8::Handle<v8::Object>
>> > > object={...}, const char * method=0x00d68254, int argc=3,
>> > > v8::Handle<v8::Value> * argv=0x0012e4b0)  Line 111 + 0x12 bytes C++
>> > >        Agent.exe!read_handle<void>::operator()(const
>> > > boost::system::error_code & ec={...}, unsigned int
>> > > bytes_transferred=661)  Line 226        C++
>> > >
>> =========================================================================
>> > > It seem like each time GC, String::New ASSERT, who can help me about
>> > > that.
>> >
>> > > --
>> > > v8-users mailing list
>> > > [email protected]
>> > >http://groups.google.com/group/v8-users
>>
>> --
>> v8-users mailing list
>> [email protected]
>> http://groups.google.com/group/v8-users
>>
>
>  --
> v8-users mailing list
> [email protected]
> http://groups.google.com/group/v8-users
>

-- 
v8-users mailing list
[email protected]
http://groups.google.com/group/v8-users

Reply via email to