2008-01-01から1年間の記事一覧

HSP on JS のモジュール変数

こんなスクリプトが動きます。 #module mod_human m_name #modinit str name m_name = name return #defcfunc new_human str name, local instance newmod instance, mod_human, name return instance #defcfunc human_get_name modvar mod_human@ return m_…

明らかに関数の内部に不正な方法で入ってくることがない関数を静的に調べたい

HSP

HSP では goto などで関数の内部に外側から簡単に入ったりできる。そのために仮引数やローカル変数の参照、代入や return がその関数がスタックトップの状態で実行されるかということが静的には分からない。でも、明らかに不正な方法で関数内部に入ってくる…

Webkit Nightly Builds (r39088) で setTimeout 内で canvas 2d context の fillText メソッドを呼んでも何も描画されない

JS

環境: WebKit-r39088 (Windows XP Home SP2) デモ: http://www.fujidig.com/misc/js/canvas/safari-canvas-text.html <html lang="ja"> <head profile="http://purl.org/net/ns/metaprof"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </meta></head></html>

モジュール変数デストラクタ呼び出しを消した

理由 高速化の邪魔になるから 別の変数から参照されているのにデストラクタが呼び出されるのは不自然に感じるから あっても嬉しいことがなさそう struct 型の値に newmod されたときのものか(それともクローンか)というフラグを持たせるのが気持ち悪い del…

裁判員になる確率は1/100です - www.textfile.org

883840239413745673888484367614071057790536685391943120866342686853088554088962741529800523812714432924482598710613913144352575140063676571506082961578643064214433481064949969375249999 / 88817841970012523233890533447265625000000000000000000…

Firefox 3.1 beta 1 で display: none な iframe 内の canvas 2d context の font プロパティに代入するとエラーが出る

JS

デモ <meta charset=utf-8> <title>Firefox 3.1 beta 1 で display: none な iframe 内の canvas 2d context の font プロパティに代入するとエラーが出る</title> <script type="text/javascript"> window.addEventListener('load', function() { var iframe = document.createElement('iframe'); iframe.setAttribute('width',</meta>…

canvas で矢印キーを受け取るサンプル - フォーカスが当たっているときにキーの動作を奪ってページがスクロールしないように

JS

canvas で矢印キーを受け取るサンプルです。矢印キーに対応して四角が動きます。 http://www.fujidig.com/misc/js/canvas/keymove1.html window.addEventListener('load', function() { var canvas = document.getElementById('game-screen'); var x = 50, y…

HSP on JS GUI の試み

HTML5 Canvas を使って HSP on JS で GUI のスクリプトを動す試みです。 http://www.fujidig.com/hsp-on-js/gui-trial.html http://coderepos.org/share/changeset/23304 といっても、まだ color 命令と boxf 命令しかありません...。 Firefox, Opera, Safar…

V8 (Google Chrome) でのバグ(switch - caseで間違えてdefaultに飛ぶ)

JS

V8 version 0.4.2.1 (trunk rev.678)で以下のコードで「3!」が出力されるべきなのに、「default!」が出力されます。(Google Chrome 0.3.154.9 でも再現するバグです) var a = 3; a += 0x7fffffff; a -= 0x7fffffff; switch(a) { case 0: break; case 1: br…

with と function 文

JS

var Foo = {}; with(Foo) { Foo.Bar = 1; function f() { Bar; } } f(); は Firefox ではエラーが出ないけど、 IE, Safari, Opera, Google Chrome で ReferenceError が出る。 var Foo = {}; with(Foo) { Foo.Bar = 1; var f = function f() { Bar; } } f();…

HSPLet と HSP on JS の Reference の違い

a.1 = 12345 dup b, a.1 a = 0.0, 1.0 mes "<"+b+">"で、HSPLet は を表示するけど、 HSP on JS では . HSPLet の Reference は Variable を参照先にすることがあるけど、 HSP on JS の Reference は Variable を参照先にすることはなく、 HSPArray のインス…

配列変数の添え字

#module #deffunc f var a sdim a@, 64, 3 a@.0.0 = "A", "B", "C" a@.0.1 = "D", "E", "F" mes a return #global f a.1.1オフィシャル HSP はこれで "D" が出るけど、 HSP on JS では "E"。オフィシャル HSP では変数オブジェクト(PVal)と配列を一直線に…

PValアドレスとAPTRってHSPCTX::prmstackを経由しなくてもとれる その2

HSP

PValアドレスとAPTRってHSPCTX::prmstackを経由しなくてもとれる - fujidigの雑記 で mref を使って PVal と APTR を取得するということをしましたが、新たに PVal と APTR を取得する方法を発見。 code_get の TYPE_STRUCT でちゃんとチェックしてない - fu…

code_get の TYPE_STRUCT でちゃんとチェックしてない

HSP

こんなコードで落とせる。 #module #deffunc f var p *a mes p return #deffunc f2 goto *a #global f2まあ、それを利用(悪用?)して、こんな風に関数本体の定義を下にかけたりできるわけだけど。 #module #deffunc f int a, double b, str c goto *lab_f_…

STRUCTDAT, STRUCTPRM あたりを調べた

HSP

HSP on JS でそろそろユーザ定義命令・関数を実装するかーと思ったんで、理解が浅い STRUCTDAT, STRUCTPRM あたりを調べることにした。結構複雑。 STRUCTDAT ユーザー定義命令・関数や DLL の関数、モジュール変数定義の情報。 ax の FINFO にこれの配列が格…

文字列のnバイト目がShift_JIS(CP932)のマルチバイト文字の後続バイトか調べる

Shift_JISのマルチバイト文字後続バイトの範囲内の str[index] がマルチバイト文字の後続バイトかを調べる。 index が 0 なら false を返す str[index-1] がマルチバイト文字先行バイトの範囲内でなければ false を返す str[index-1] がマルチバイト文字後続…

文字列のn行目のインデックスを取得

JS

文字列のn行目の先頭が文字列先頭から何文字目かを取得する関数。 4 つ書いてみた。 function getLineIndex1(str, lineno) { var curline = 0; var len = str.length; for(var i = 0; i < len; i ++) { if(curline == lineno) return i; var c = str.charAt(…

JavaScript による HSP インタプリタ HSP on JS

http://www.fujidig.com/hsp-on-js/samples.html HSP on JS は JavaScript による HSP のインタプリタの実装です。 CodeRepos にリポジトリを置いて開発しています。 対応している機能 まず、 GUI 描画命令はありません。 mes 命令を実行したら textarea に…

HSP の文字列

HSP

式での文字列と変数で管理している文字列のバッファを分けて考えたらいいんじゃないかと思った。 式での文字列 不変 '\0' を含まない 文字列型変数から式へ: '\0' までを取り出す 変数で管理している文字列のバッファ 可変。 代入や連結、 poke や memcpy な…

ラベル型変数のvaruse

HSP

*first dimtype a, 1 b = *first c = *last mes varuse(a) ; >> 0 mes varuse(b) ; >> 0 mes varuse(c) ; >> 1 d = a, b, c mes foreach d ; 0, 1 は skip される mes cnt ; >> 2 loop *lastvaruse ってコード先頭を指すラベルかどうかを調べているだけじゃ…

仮引数に代入するとargumentsで得られる値も変動するんですね...

JS

(function(a){a=1;return arguments[0]})(9,8,7) // => 1知りませんでした><

連続代入の評価の順番

HSP

#module #defcfunc f mes a@ return 0 #global a = 111 a = 222, f()は 111 を表示するでしょうか、それとも 222 を表示するでしょうかーという話。 オフィシャル HSP でも HSPLet でも 222 でした。 こんなもの、HSPの仕様的に決まっているとも思えないので…

dim a, 1, 0, 1 とかいけるのか。

HSP

dim a, 1, 0, 1 mes length(a) mes length2(a) mes length3(a) mes length4(a)1 0 1 0こんなlengthもいけるのかー。 とりあえず今は 1 1 1 0 になっても困るようなケースはほとんどないと信じておく。

配列の最後から n 個値を取得するときに arr.slice(-n) とすると n が 0 のとき期待しない値になる

JS

タイトルどおり。 スタックから n 個 pop するときに var args = stack.slice(-argc); stack.length -= argc; とかしてたんだけど、これだと argc が 0 のとき args が空の配列でなく stack 全体のコピーになってしまう。 これでハマった。 - はてさて、どう…

a(0,0) = 1, 2, 3 と a(0,0) = 1 : a(1,0) = 2 : a(2,0) = 3 は等価じゃない

HSP

a(0,0) = 1 : a(1,0) = 2 : a(2,0) = 3 はエラーになるもんね。そうだったそうだった。 - ってアッッ! a(0,0) = 1, 2, 3 も実行したらエラーになった。 ああ、なんだ。そうだったのか。 ということで、「等価じゃない」というのはうそでした。

四次元より大きい次元の指定はエラーにならず単に無視される

HSP

dim a, 1, 1, 1, 1 mes a(0, 0, 0, 0, 0)a(1,1,1,1,1) = 1どっちもエラーにならない。

HSPLet 次元をまたいで連続代入されてしまう

HSP

dim a, 3, 3 a.1.0 = 111, 222, 333 repeat 3 : y = cnt repeat 3 : x = cnt mes "a("+x+","+y+") = "+a(x,y) loop loopこれ、オフィシャルHSP3だと代入のところでエラーになる。 HSPLetなら通ってしまう。 a(0,0) = 0 a(1,0) = 111 a(2,0) = 222 a(0,1) = 3…

PValアドレスとAPTRってHSPCTX::prmstackを経由しなくてもとれる

HSP

mrefのリソースID 0, 1 を使うってだけ。 #module #defcfunc get_pval1 var mref hspctx, 68 dupptr vptr, hspctx(207), 4 return vptr #defcfunc get_aptr1 var mref hspctx, 68 dupptr vptr, hspctx(207)+4, 4 return vptr #global #module #defcfunc get_…

SleepVM に関数呼び出しを追加してみた

JS

るびま には宿題として関数呼び出しを実装してみろ、というのがあったのでやってみました。 http://www.fujidig.com/misc/js/sleepvm2.html サンプルのプログラムとしてユークリッドの互除法をやってみました。 # goto :main :gcd # ユークリッドの互除法 ge…

RubiMaVM の JS 移植版に sleep をつけてブラウザで固まらずに複数動作できるようにしてみた

JS

http://www.fujidig.com/misc/js/sleepvm.html