hspのjs実行はEmscriptenを使っていて
class C {
public:
int a;
double b;
C() : a(0), b(0) {}
double foo() {
a++;
b = (b + a) / 3.0;
return a + b;
}
};
みたいなC++コードが
var buffer = new ArrayBuffer(16908288);
var HEAP32 = new Int32Array(buffer);
var HEAPF64 = new Float64Array(buffer);
function __original_main() {
var $2 = 0, $46 = 0;
$2 = __stack_pointer - 32 | 0;
__stack_pointer = $2;
HEAP32[($2 + 28 | 0) >> 2] = 0;
C__C_28_29($2 + 8 | 0 | 0) | 0;
+C__foo_28_29($2 + 8 | 0 | 0);
+C__foo_28_29($2 + 8 | 0 | 0);
__stack_pointer = $2 + 32 | 0;
return 0 | 0;
}
function C__C_28_29($0) {
$0 = $0 | 0;
var $4 = 0, $3 = 0, $23 = 0;
$3 = __stack_pointer - 16 | 0;
HEAP32[($3 + 12 | 0) >> 2] = $0;
$4 = HEAP32[($3 + 12 | 0) >> 2] | 0;
HEAP32[$4 >> 2] = 0;
HEAPF64[($4 + 8 | 0) >> 3] = +(0 | 0);
return $4 | 0;
}
function C__foo_28_29($0) {
$0 = $0 | 0;
var $4 = 0, $3 = 0, $57 = 0.0;
$3 = __stack_pointer - 16 | 0;
HEAP32[($3 + 12 | 0) >> 2] = $0;
$4 = HEAP32[($3 + 12 | 0) >> 2] | 0;
HEAP32[$4 >> 2] = (HEAP32[$4 >> 2] | 0) + 1 | 0;
HEAPF64[($4 + 8 | 0) >> 3] = (+HEAPF64[($4 + 8 | 0) >> 3] + +(HEAP32[$4 >> 2] | 0 | 0)) / 3.0;
return +(+(HEAP32[$4 >> 2] | 0 | 0) + +HEAPF64[($4 + 8 | 0) >> 3]);
}
みたいなJavaScriptになります。
これをChatGPTにHSPに変換させて(
https://chatgpt.com/share/68293c25-3f4c-8010-a3a8-6ae13e4f1534 )、エラーをちょこちょこ直すと
#module
; バッファサイズ定義
#const BUF_SIZE 16908288
#deffunc init_sys
; ヒープ領域を確保
dim HEAP32, BUF_SIZE ; 32bit 整数配列
ddim HEAPF64, BUF_SIZE ; 64bit 浮動小数点配列
; スタックポインタの初期値(必要に応じて変更してください)
__stack_pointer = BUF_SIZE
return
;----------------------------------------
; int __original_main()
;----------------------------------------
#defcfunc __original_main local sp, local tmp
; スタックフレーム確保
sp = __stack_pointer - 32
__stack_pointer = sp
; HEAP32[(sp + 28) >> 2] = 0
HEAP32((sp + 28) >> 2) = 0
; C__C_28_29(sp + 8)
tmp = C__C_28_29(sp + 8)
; +C__foo_28_29(sp + 8)
tmp = C__foo_28_29(sp + 8)
mes tmp
; +C__foo_28_29(sp + 8) の二回目
tmp = C__foo_28_29(sp + 8)
mes tmp
; スタックフレーム解放
__stack_pointer = sp + 32
return 0
;----------------------------------------
; int C__C_28_29(int ptr)
;----------------------------------------
#defcfunc C__C_28_29 int ptr, local sp, local base
; スタックフレーム確保
sp = __stack_pointer - 16
; 引数をローカルに保存
HEAP32((sp + 12) >> 2) = ptr
; base = ptr
base = HEAP32((sp + 12) >> 2)
; HEAP32[ base >> 2 ] = 0
HEAP32(base >> 2) = 0
; HEAPF64[(base + 8) >> 3] = 0.0
HEAPF64((base + 8) >> 3) = 0.0
return base
;----------------------------------------
; double C__foo_28_29(int ptr)
;----------------------------------------
#defcfunc C__foo_28_29 int ptr, local sp, local base, local result
; スタックフレーム確保
sp = __stack_pointer - 16
; 引数をローカルに保存
HEAP32((sp + 12) >> 2) = ptr
; base = ptr
base = HEAP32((sp + 12) >> 2)
; HEAP32[ base >> 2 ] += 1
HEAP32(base >> 2) = HEAP32(base >> 2) + 1
; HEAPF64[(base + 8) >> 3] = (HEAPF64[(base + 8) >> 3] + HEAP32[base >> 2]) / 3.0
HEAPF64((base + 8) >> 3) = (HEAPF64((base + 8) >> 3) + HEAP32(base >> 2)) / 3.0
; result = HEAP32[base >> 2] + HEAPF64[(base + 8) >> 3]
result = double(HEAP32(base >> 2)) + HEAPF64((base + 8) >> 3)
return result
#global
init_sys
r = __original_main()
mes r
みたいなHSPコードになってHSPでクラスが使えるよやったねとなる用途とならない用途がありそうです。