<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BombStrike's blog &#187; server</title>
	<atom:link href="http://www.bombstrike.org/tag/server/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bombstrike.org</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Sun, 07 Mar 2010 22:44:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Spidermonkey gets fixed and gets ready to move from &#8220;beta&#8221; to &#8220;stable&#8221;</title>
		<link>http://www.bombstrike.org/2010/03/spidermonkey-gets-fixed-and-gets-ready-to-move-from-beta-to-stable/</link>
		<comments>http://www.bombstrike.org/2010/03/spidermonkey-gets-fixed-and-gets-ready-to-move-from-beta-to-stable/#comments</comments>
		<pubDate>Sun, 07 Mar 2010 22:07:31 +0000</pubDate>
		<dc:creator>Christophe Robin</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pecl]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[spidermonkey]]></category>

		<guid isPermaLink="false">http://www.bombstrike.org/?p=125</guid>
		<description><![CDATA[Hello, it&#8217;s been a while since I last wrote something on this blog. Today I come back to tell you that version 0.1.4 of spidermonkey has finally been released and provide fixes for 3 bugs that where posted on the PECL bug tracker, I&#8217;ll do a small explanation of each bug and how they were [...]]]></description>
			<content:encoded><![CDATA[<p>Hello, it&#8217;s been a while since I last wrote something on this blog. Today I come back to tell you that version 0.1.4 of spidermonkey has finally been released and provide fixes for 3 bugs that where posted on the PECL bug tracker, I&#8217;ll do a small explanation of each bug and how they were resolved bellow. I also took care of integrating some patches for spidermonkey 1.9, added the config.w32 from <em><a href="http://developer.cybozu.co.jp/oss/">hoshino at labs dot cybozu dot co dot jp</a></em> and changed a couple stuff there and there in the source code. I also added regression tests for the solved bugs and updated some of the previous ones to reflect the corresponding changes.</p>
<h1>Fixed bugs</h1>
<h2><strong>Bug <a href="http://pecl.php.net/bugs/bug.php?id=16866" target="_blank">16866</a>:</strong></h2>
<p>This bug was pretty basic, when an empty string was returned from Javascript, the current PHP thread would segfault. The reason was simple, when Spidermonkey hold a variable that contains an empty string, it doesn&#8217;t possess a <em>char* </em>that would point to this empty string to save memory, so when I tried to retrieve this non-existing value to create an empty string in PHP, it would just segfault. I just solved this by checking the variable length in JS before doing the conversion, quite trivial compared to some bugs to come. It also solved bug <a href="http://pecl.php.net/bugs/bug.php?id=16876" target="_blank">16876</a>.</p>
<h2>Bug <a href="http://pecl.php.net/bugs/bug.php?id=16890" target="_blank">16890</a>:</h2>
<p>That one was another beast, when an object created in javascript was converted to PHP, it would become NULL on the next call. Clearly there was something weird going on here, after some painful debug, I saw that the issue came from a small caching system I had made that had no sense at all and was actually useless. Here is what it was doing:</p>
<p>When the javascript class was converted, it created the object and store it in a Zend HashTable with the JSObject id as its index. It would then retrieve the object from this &#8220;<em>cache</em>&#8221; when trying to access the object again. The basic idea at the time was to optimize objects that where converted back and forth a lot of time by pulling them from the cache, and preventing cyclic references by providing the cached objects without having to traverse it ( otherwise it would result in an infinite loop ). While the goal was great, the execution had several flaw, the biggest one was that for an unknown reason all objects that where stored were returned as NULL by the HashTable. But even if it had worked it would have caused issue with objects that were converted, modified in Javascript afterward and converted again, as the stored object would have been returned and not the updated one.</p>
<p>To solve this cyclic reference issue, I totally changed the approach by first removing this HashTable idea and then creating a basic structure that looked like:</p>
<div class="codecolorer-container c default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="c codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333;">typedef</span> <span style="color: #993333;">struct</span> _php_jsparent <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; JSObject &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">*</span>obj<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; zval &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">*</span>zobj<span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #993333;">struct</span> _php_jsparent &nbsp; &nbsp;<span style="color: #339933;">*</span>parent<span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span> php_jsparent<span style="color: #339933;">;</span></div></div>
<p>When I run my js to zval routine, I pass a new parameter php_jsparent *parent that is NULL by default, if i&#8217;m converting an object, I create this jsparent object, store the current JSObject being converted, the stdClass zval that is being created and our parent if theres one and call the converting method recursively on each children. Now when *parent is defined, before converting an object I do a quick traversal of the parent links and if I find a JSObject *obj that is the same as the object I&#8217;m converting I just return the stored zobj, effectively solving the cyclic referencing issue.</p>
<p><i>Sample code:</i></p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">a <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> b <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">null</span> <span style="color: #009900;">&#125;</span><br />
a.<span style="color: #660066;">b</span> <span style="color: #339933;">=</span> a<br />
<span style="color: #006600; font-style: italic;">/* in this case, trying to convert the a object result as a cyclic reference<br />
&nbsp; when trying to convert the properties, the new code solves this when<br />
&nbsp; trying to convert b, it checks it's parent which is in this case a, and <br />
&nbsp; see that a == b, returning then the parent zobj and solving the issue */</span></div></div>
<h2><strong>Bug <a href="http://pecl.php.net/bugs/bug.php?id=16983" target="_blank">16983</a>:</strong></h2>
<p>Another tricky one. When the magic __get() method was defined on a class it became impossible to call any method on it.</p>
<p>The issue with this one was the JS_PropertyGetterPHP() function, which is a C getter function that is called on a Javascript object even if a property exists, I would then call the Zend getter function on the object and return the value if found. The main issue was that I wasn&#8217;t taking care of properties already defined on the JS side, and always trying to retrieve the data from the PHP side. This issue was solved pretty fast, I decided to reproduce the same functionality as PHP, that means that when this getter is called it first try to retrieve data from JS, in the case of methods, if would retrieve the property I had defined beforehand when creating the object and return it to our context. If it effectively doesn&#8217;t find anything on javascript, if then fallback on the PHP item, calling __get() if necessary.</p>
<h2>Feedback</h2>
<p>Most blocking bugs have been solved with this release, feel free to post on the bug tracker any new issue you would encounter and I&#8217;ll make sure to take a look. If no bugs are found, then I&#8217;ll make sure to finish a few things there and there and will release version 1.0.0 as stable to allow more peoples to use it safely.</p>
<h1>Future tasks</h1>
<p>There are several thing I&#8217;d like to do, like better debugging support using the tracing API that is being added in spidermonkey since 1.8+. But first would be support for closures in both directions, that means having access to JS function directly from PHP (that one is really hard, it will takes some time of tingling with the PHP internals to make it works) and assigning closures in JS (should be a lot easier). I already added the test on the SVN, and I&#8217;ll try to tackle this one in the next months.<br />
If you have any idea of feature that you&#8217;d like to see implemented, feel free to ask in the comments <img src='http://www.bombstrike.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.bombstrike.org/2010/03/spidermonkey-gets-fixed-and-gets-ready-to-move-from-beta-to-stable/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spidermonkey in PECL</title>
		<link>http://www.bombstrike.org/2009/02/spidermonkey-in-pecl/</link>
		<comments>http://www.bombstrike.org/2009/02/spidermonkey-in-pecl/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 17:59:04 +0000</pubDate>
		<dc:creator>Christophe Robin</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[Code]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[pecl]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[spidermonkey]]></category>

		<guid isPermaLink="false">http://www.bombstrike.org/?p=107</guid>
		<description><![CDATA[Today I finally released spidermonkey on PECL, you can find it here: http://pecl.php.net/package/spidermonkey/
The whole thing should work fine, I&#8217;m already working on several optimisations thanks to jorendorff from Mozilla on IRC. The next thing is to provide better error report, compilation/decompilation of scripts and more default functions for a bunch of things like Iterators and [...]]]></description>
			<content:encoded><![CDATA[<p>Today I finally released spidermonkey on PECL, you can find it here: <a href="http://pecl.php.net/package/spidermonkey/">http://pecl.php.net/package/spidermonkey/</a></p>
<p>The whole thing should work fine, I&#8217;m already working on several optimisations thanks to jorendorff from Mozilla on IRC. The next thing is to provide better error report, compilation/decompilation of scripts and more default functions for a bunch of things like Iterators and the like.</p>
<p>The last thing I added is a bunch of function applied to streams, here is an exemple:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">/* create context */</span><br />
<span style="color: #000088;">$ctx</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> JSContext<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">/* provide fopen/fclose functions */</span><br />
<span style="color: #000088;">$ctx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fopen'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$ctx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fclose'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">/* for output */</span><br />
<span style="color: #000088;">$ctx</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">registerFunction</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'printf'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></div>
<p>Then in Javascript:</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/* open file */</span><br />
fd <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'somefile.txt'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'r'</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000066; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>line <span style="color: #339933;">=</span> fd.<span style="color: #660066;">getline</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; printf<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;%s<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> line<span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#125;</span><br />
fclose<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span></div></div>
<p>Or</p>
<div class="codecolorer-container javascript default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="javascript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #006600; font-style: italic;">/* open file */</span><br />
fd <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'somefile.txt'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'w'</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009966; font-style: italic;">/* here fd.SEEK_SET is the default value and is optional */</span><br />
fd.<span style="color: #660066;">seek</span><span style="color: #009900;">&#40;</span>1024<span style="color: #339933;">,</span> fd.<span style="color: #660066;">SEEK_SET</span><span style="color: #009900;">&#41;</span><br />
fd.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;some text here :D&quot;</span><span style="color: #009900;">&#41;</span><br />
fclose<span style="color: #009900;">&#40;</span>fd<span style="color: #009900;">&#41;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.bombstrike.org/2009/02/spidermonkey-in-pecl/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
