Hi, how should I correctly modify the html? I was just trying to use the 
method you mentioned in 
https://groups.google.com/d/msg/emscripten-discuss/xDHk29DJ6zI/l5ishrLBu7UJ

Thanks

On Wednesday, April 8, 2015 at 8:17:34 PM UTC+1, Alon Zakai wrote:
>
> That html looks invalid. It will run the code in the last script tag 
> immediately, without waiting for onRuntimeInitialized.
>
> - Alon
>
>
> On Tue, Apr 7, 2015 at 11:47 PM, <[email protected] <javascript:>> wrote:
>
>> Hi, it also works for me in the console (I hadn't tried that until you 
>> mentioned). However it fails in the following html in both chrome and 
>> firefox (but only with O2/O3 optimisations. With O0, O1 it works fine) : 
>>
>> <!DOCTYPE html>
>> <html>
>>
>> <head>
>>     <meta charset="UTF-8">
>>     <title>simple page</title>
>> </head>
>>
>> <body>
>>
>> <script type="text/javascript">
>>     var Module = { onRuntimeInitialized: function() {
>>       Module._test();
>>     } };
>> </script>
>>
>> <script type='text/javascript' src="a.out.js"></script>
>>
>> <script type='text/javascript'>
>>   mytest = Module.cwrap('test', 'number', ['number']);
>>   var result = mytest(0);
>>   document.write(result);
>>   document.write('<BR/>');
>>   document.write("\rFinished!");
>> </script>
>>   
>> </body>
>>
>> </html>
>>
>> On Wednesday, April 8, 2015 at 12:40:02 AM UTC+1, Alon Zakai wrote:
>>>
>>> I just put the js in an empty html file, and looked in the web console 
>>> at the output.
>>>
>>> - Alon
>>>
>>>
>>> On Tue, Apr 7, 2015 at 1:32 PM, <[email protected]> wrote:
>>>
>>>> Hi, I am actually getting the same behaviour in chrome and firefox. 
>>>> What does the html code that you are using to access the function look 
>>>> like? Thanks
>>>>
>>>> On Monday, April 6, 2015 at 10:41:05 PM UTC+1, Alon Zakai wrote:
>>>>>
>>>>> I built with -O3 and ran it in html, and I can't see the problem.
>>>>>
>>>>> Perhaps try other browsers and versions, you may have found a browser 
>>>>> bug.
>>>>>
>>>>> - Alon
>>>>>
>>>>>
>>>>> On Mon, Apr 6, 2015 at 1:09 PM, <[email protected]> wrote:
>>>>>
>>>>>> Just to clarify, building with em++ is fine. I only get a problem 
>>>>>> when it try to use the resulting a.out.js in html. Thanks
>>>>>>
>>>>>> On Monday, April 6, 2015 at 7:53:28 PM UTC+1, Alon Zakai wrote:
>>>>>>>
>>>>>>> What are the steps to reproduce the problem? I build that source 
>>>>>>> file with -O0, 1, 2 and 3, and in all of them I get "42" as the output.
>>>>>>>
>>>>>>> - Alon
>>>>>>>
>>>>>>>
>>>>>>> On Sat, Apr 4, 2015 at 7:12 AM, <[email protected]> wrote:
>>>>>>>
>>>>>>>> OK the following self contained code (*not* calling any boost 
>>>>>>>> headers) is fine with O0 or O1, but not with O2 or O3. The function 
>>>>>>>> which I 
>>>>>>>> am exporting is :
>>>>>>>>
>>>>>>>> extern "C" {
>>>>>>>>   double test(void) {
>>>>>>>>     boost::shared_ptr<int> y = boost::shared_ptr<int>(new int(42));
>>>>>>>>     return *y;
>>>>>>>>   }
>>>>>>>> }
>>>>>>>>
>>>>>>>> The invocation of "dispose()" and "weak_release()"  in 
>>>>>>>> "sp_counted_base::release" is what is causing the problems : 
>>>>>>>>
>>>>>>>> #include <atomic>
>>>>>>>> #include <iostream>
>>>>>>>> #include <vector>
>>>>>>>> using namespace std;
>>>>>>>>
>>>>>>>> namespace boost
>>>>>>>> {
>>>>>>>>
>>>>>>>> namespace core
>>>>>>>> {
>>>>>>>>
>>>>>>>>
>>>>>>>> class typeinfo
>>>>>>>> {
>>>>>>>> private:
>>>>>>>>
>>>>>>>>     typeinfo( typeinfo const& );
>>>>>>>>     typeinfo& operator=( typeinfo const& );
>>>>>>>>
>>>>>>>>     char const * name_;
>>>>>>>>
>>>>>>>> public:
>>>>>>>>
>>>>>>>>     explicit typeinfo( char const * name ): name_( name )
>>>>>>>>     {
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     bool operator==( typeinfo const& rhs ) const
>>>>>>>>     {
>>>>>>>>         return this == &rhs;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     bool operator!=( typeinfo const& rhs ) const
>>>>>>>>     {
>>>>>>>>         return this != &rhs;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     bool before( typeinfo const& rhs ) const
>>>>>>>>     {
>>>>>>>>         return std::less< typeinfo const* >()( this, &rhs );
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     char const* name() const
>>>>>>>>     {
>>>>>>>>         return name_;
>>>>>>>>     }
>>>>>>>> };
>>>>>>>>
>>>>>>>>
>>>>>>>> }//namespace core
>>>>>>>>
>>>>>>>> template<class T> class shared_ptr;
>>>>>>>> template<class T> class enable_shared_from_this;
>>>>>>>>
>>>>>>>> template<class T> inline void checked_delete(T * x)
>>>>>>>> {
>>>>>>>>     // intentionally complex - simplification causes regressions
>>>>>>>>     typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
>>>>>>>>     (void) sizeof(type_must_be_complete);
>>>>>>>>     delete x;
>>>>>>>> }
>>>>>>>>
>>>>>>>> namespace detail
>>>>>>>> {
>>>>>>>>
>>>>>>>> typedef boost::core::typeinfo sp_typeinfo;
>>>>>>>>
>>>>>>>> inline void atomic_increment( std::atomic_int_least32_t * pw )
>>>>>>>> {
>>>>>>>>     pw->fetch_add( 1, std::memory_order_relaxed );
>>>>>>>> }
>>>>>>>>
>>>>>>>> inline std::int_least32_t atomic_decrement( 
>>>>>>>> std::atomic_int_least32_t * pw )
>>>>>>>> {
>>>>>>>>     return pw->fetch_sub( 1, std::memory_order_acq_rel );
>>>>>>>> }
>>>>>>>>
>>>>>>>> inline std::int_least32_t atomic_conditional_increment( 
>>>>>>>> std::atomic_int_least32_t * pw )
>>>>>>>> {
>>>>>>>>     // long r = *pw;
>>>>>>>>     // if( r != 0 ) ++*pw;
>>>>>>>>     // return r;
>>>>>>>>
>>>>>>>>     std::int_least32_t r = pw->load( std::memory_order_relaxed );
>>>>>>>>
>>>>>>>>     for( ;; )
>>>>>>>>     {
>>>>>>>>         if( r == 0 )
>>>>>>>>         {
>>>>>>>>             return r;
>>>>>>>>         }
>>>>>>>>
>>>>>>>>         if( pw->compare_exchange_weak( r, r + 1, 
>>>>>>>> std::memory_order_relaxed, std::memory_order_relaxed ) )
>>>>>>>>         {
>>>>>>>>             return r;
>>>>>>>>         }
>>>>>>>>     }    
>>>>>>>> }
>>>>>>>>
>>>>>>>> class sp_counted_base
>>>>>>>> {
>>>>>>>> private:
>>>>>>>>
>>>>>>>>     sp_counted_base( sp_counted_base const & );
>>>>>>>>     sp_counted_base & operator= ( sp_counted_base const & );
>>>>>>>>
>>>>>>>>     std::atomic_int_least32_t use_count_; // #shared
>>>>>>>>     std::atomic_int_least32_t weak_count_; // #weak + (#shared != 
>>>>>>>> 0)
>>>>>>>>
>>>>>>>> public:
>>>>>>>>
>>>>>>>>     sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
>>>>>>>>     {
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     virtual ~sp_counted_base() // nothrow
>>>>>>>>     {
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     // dispose() is called when use_count_ drops to zero, to release
>>>>>>>>     // the resources managed by *this.
>>>>>>>>
>>>>>>>>     virtual void dispose() = 0; // nothrow
>>>>>>>>
>>>>>>>>     // destroy() is called when weak_count_ drops to zero.
>>>>>>>>
>>>>>>>>     virtual void destroy() // nothrow
>>>>>>>>     {
>>>>>>>>         delete this;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
>>>>>>>>     virtual void * get_untyped_deleter() = 0;
>>>>>>>>
>>>>>>>>     void add_ref_copy()
>>>>>>>>     {
>>>>>>>>         atomic_increment( &use_count_ );
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     bool add_ref_lock() // true on success
>>>>>>>>     {
>>>>>>>>         return atomic_conditional_increment( &use_count_ ) != 0;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     void release() // nothrow
>>>>>>>>     {
>>>>>>>>         if( atomic_decrement( &use_count_ ) == 1 )
>>>>>>>>         {
>>>>>>>>           dispose();
>>>>>>>>           weak_release();
>>>>>>>>         }
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     void weak_add_ref() // nothrow
>>>>>>>>     {
>>>>>>>>         atomic_increment( &weak_count_ );
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     void weak_release() // nothrow
>>>>>>>>     {
>>>>>>>>         if( atomic_decrement( &weak_count_ ) == 1 )
>>>>>>>>         {
>>>>>>>>             destroy();
>>>>>>>>         }
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     long use_count() const // nothrow
>>>>>>>>     {
>>>>>>>>         return use_count_.load( std::memory_order_acquire );
>>>>>>>>     }
>>>>>>>> };
>>>>>>>>
>>>>>>>>
>>>>>>>> template<class X> class sp_counted_impl_p: public sp_counted_base
>>>>>>>> {
>>>>>>>> private:
>>>>>>>>
>>>>>>>>     X * px_;
>>>>>>>>
>>>>>>>>     sp_counted_impl_p( sp_counted_impl_p const & );
>>>>>>>>     sp_counted_impl_p & operator= ( sp_counted_impl_p const & );
>>>>>>>>
>>>>>>>>     typedef sp_counted_impl_p<X> this_type;
>>>>>>>>
>>>>>>>> public:
>>>>>>>>
>>>>>>>>     explicit sp_counted_impl_p( X * px ): px_( px )
>>>>>>>>     {
>>>>>>>> #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
>>>>>>>>         boost::sp_scalar_constructor_hook( px, sizeof(X), this );
>>>>>>>> #endif
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     virtual void dispose() // nothrow
>>>>>>>>     {
>>>>>>>> #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
>>>>>>>>         boost::sp_scalar_destructor_hook( px_, sizeof(X), this );
>>>>>>>> #endif
>>>>>>>>         boost::checked_delete( px_ );
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     virtual void * get_deleter( detail::sp_typeinfo const & )
>>>>>>>>     {
>>>>>>>>         return 0;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     virtual void * get_untyped_deleter()
>>>>>>>>     {
>>>>>>>>         return 0;
>>>>>>>>     }
>>>>>>>>
>>>>>>>> #if defined(BOOST_SP_USE_STD_ALLOCATOR)
>>>>>>>>
>>>>>>>>     void * operator new( std::size_t )
>>>>>>>>     {
>>>>>>>>         return std::allocator<this_type>().allocate( 1, 
>>>>>>>> static_cast<this_type *>(0) );
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     void operator delete( void * p )
>>>>>>>>     {
>>>>>>>>         std::allocator<this_type>().deallocate( 
>>>>>>>> static_cast<this_type *>(p), 1 );
>>>>>>>>     }
>>>>>>>>
>>>>>>>> #endif
>>>>>>>>
>>>>>>>> #if defined(BOOST_SP_USE_QUICK_ALLOCATOR)
>>>>>>>>
>>>>>>>>     void * operator new( std::size_t )
>>>>>>>>     {
>>>>>>>>         return quick_allocator<this_type>::alloc();
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     void operator delete( void * p )
>>>>>>>>     {
>>>>>>>>         quick_allocator<this_type>::dealloc( p );
>>>>>>>>     }
>>>>>>>>
>>>>>>>> #endif
>>>>>>>> };
>>>>>>>>
>>>>>>>> class shared_count
>>>>>>>> {
>>>>>>>> private:
>>>>>>>>
>>>>>>>>     sp_counted_base * pi_;
>>>>>>>>
>>>>>>>> public:
>>>>>>>>
>>>>>>>>     void swap(shared_count & r) // nothrow
>>>>>>>>     {
>>>>>>>>         sp_counted_base * tmp = r.pi_;
>>>>>>>>         r.pi_ = pi_;
>>>>>>>>         pi_ = tmp;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     shared_count(): pi_(0) // nothrow
>>>>>>>> #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
>>>>>>>>         , id_(shared_count_id)
>>>>>>>> #endif
>>>>>>>>     {
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     template<class Y> explicit shared_count( Y * p ): pi_( 0 )
>>>>>>>> #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
>>>>>>>>         , id_(shared_count_id)
>>>>>>>> #endif
>>>>>>>>     {
>>>>>>>> #ifndef BOOST_NO_EXCEPTIONS
>>>>>>>>
>>>>>>>>         try
>>>>>>>>         {
>>>>>>>>             pi_ = new sp_counted_impl_p<Y>( p );
>>>>>>>>         }
>>>>>>>>         catch(...)
>>>>>>>>         {
>>>>>>>>             boost::checked_delete( p );
>>>>>>>>             throw;
>>>>>>>>         }
>>>>>>>>
>>>>>>>> #else
>>>>>>>>
>>>>>>>>         pi_ = new sp_counted_impl_p<Y>( p );
>>>>>>>>
>>>>>>>>         if( pi_ == 0 )
>>>>>>>>         {
>>>>>>>>             boost::checked_delete( p );
>>>>>>>>             boost::throw_exception( std::bad_alloc() );
>>>>>>>>         }
>>>>>>>>
>>>>>>>> #endif
>>>>>>>>     }
>>>>>>>>
>>>>>>>>
>>>>>>>>     shared_count(shared_count && r): pi_(r.pi_) // nothrow
>>>>>>>> #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
>>>>>>>>         , id_(shared_count_id)
>>>>>>>> #endif
>>>>>>>>     {
>>>>>>>>         r.pi_ = 0;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     ~shared_count() // nothrow
>>>>>>>>     {
>>>>>>>>       if( pi_ != 0 ) pi_->release();
>>>>>>>> #if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
>>>>>>>>         id_ = 0;
>>>>>>>> #endif
>>>>>>>>     }
>>>>>>>>
>>>>>>>> };
>>>>>>>>
>>>>>>>> template< class T > struct sp_element
>>>>>>>> {
>>>>>>>>     typedef T type;
>>>>>>>> };
>>>>>>>>
>>>>>>>> template< class X, class Y, class T > inline void 
>>>>>>>> sp_enable_shared_from_this( boost::shared_ptr<X> const * ppx, Y const 
>>>>>>>> * py, 
>>>>>>>> boost::enable_shared_from_this< T > const * pe )
>>>>>>>> {
>>>>>>>>     if( pe != 0 )
>>>>>>>>     {
>>>>>>>>         pe->_internal_accept_owner( ppx, const_cast< Y* >( py ) );
>>>>>>>>     }
>>>>>>>> }
>>>>>>>>
>>>>>>>> struct sp_any_pointer
>>>>>>>> {
>>>>>>>>     template<class T> sp_any_pointer( T* ) {}
>>>>>>>> };
>>>>>>>>
>>>>>>>> inline void sp_enable_shared_from_this( sp_any_pointer, 
>>>>>>>> sp_any_pointer, sp_any_pointer )
>>>>>>>> {
>>>>>>>> }
>>>>>>>>
>>>>>>>> template< class T, class Y > inline void sp_pointer_construct( 
>>>>>>>> boost::shared_ptr< T > * ppx, Y * p, boost::detail::shared_count & pn )
>>>>>>>> {
>>>>>>>>     boost::detail::shared_count( p ).swap( pn );
>>>>>>>>     boost::detail::sp_enable_shared_from_this( ppx, p, p );
>>>>>>>> }
>>>>>>>>
>>>>>>>> template< class T > struct sp_dereference
>>>>>>>> {
>>>>>>>>     typedef T & type;
>>>>>>>> };
>>>>>>>>
>>>>>>>> }//namespace detail
>>>>>>>>
>>>>>>>> template<class T> class shared_ptr
>>>>>>>> {
>>>>>>>> private:
>>>>>>>>
>>>>>>>>     // Borland 5.5.1 specific workaround
>>>>>>>>     typedef shared_ptr<T> this_type;
>>>>>>>>
>>>>>>>> public:
>>>>>>>>
>>>>>>>>     typedef typename boost::detail::sp_element< T >::type 
>>>>>>>> element_type;
>>>>>>>>
>>>>>>>>     template<class Y>
>>>>>>>>     explicit shared_ptr( Y * p ): px( p ), pn() // Y must be 
>>>>>>>> complete
>>>>>>>>     {
>>>>>>>>         boost::detail::sp_pointer_construct( this, p, pn );
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     element_type * px;                 // contained pointer
>>>>>>>>     boost::detail::shared_count pn;    // reference counter
>>>>>>>>
>>>>>>>> typename boost::detail::sp_dereference< T >::type operator* () const
>>>>>>>> {
>>>>>>>>   return *px;
>>>>>>>> }
>>>>>>>>
>>>>>>>> };
>>>>>>>>
>>>>>>>> } // namespace boost
>>>>>>>>
>>>>>>>> extern "C" {
>>>>>>>>   double test(void) {
>>>>>>>>     boost::shared_ptr<int> y = boost::shared_ptr<int>(new int(42));
>>>>>>>>     return *y;
>>>>>>>>   }
>>>>>>>> }
>>>>>>>>
>>>>>>>> int main(void){
>>>>>>>>   double result = test();
>>>>>>>>   cout<<result<<endl;
>>>>>>>>   return 0;
>>>>>>>> }
>>>>>>>>
>>>>>>>>  -- 
>>>>>>>> You received this message because you are subscribed to the Google 
>>>>>>>> Groups "emscripten-discuss" 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/d/optout.
>>>>>>>>
>>>>>>>
>>>>>>>  -- 
>>>>>> You received this message because you are subscribed to the Google 
>>>>>> Groups "emscripten-discuss" 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/d/optout.
>>>>>>
>>>>>
>>>>>  -- 
>>>> You received this message because you are subscribed to the Google 
>>>> Groups "emscripten-discuss" 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/d/optout.
>>>>
>>>
>>>  -- 
>> You received this message because you are subscribed to the Google Groups 
>> "emscripten-discuss" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" 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/d/optout.

Reply via email to