読者です 読者をやめる 読者になる 読者になる

0x90

一回休み

EmscriptenでCからJavascriptを呼ぶ その2

c emscripten

昨日の記事を書いた矢先にこんなのを見つけました。

git.habnabit.org

うーん、やまあRustの練習がてら自分でも気の済むまで書いてみようとは思いますが、やっぱり世界は広いですねえ。

上のソースを見ていて気になったところはたとえばここらへん。

impl<'a> JsRegistered for &'a str {
    unsafe fn register(ty: emscripten_sys::TYPEID, name: &CStr) {
        emscripten_sys::_embind_register_std_wstring(ty, 2, name.as_ptr());
    }
}

どうやら、typeidを勝手に登録できるっぽい。

ということで、Cでもやってみた。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>

#include "val_c.h"
#include "bind_c.h"

typedef void* str;
typedef void* wstr;

str to_str(const char* s, int len) {
  int* ptr = (int *) malloc(sizeof(int) + len);
  ptr[0] = len;
  memcpy(&ptr[1], s, len);
  return (void *) ptr;
}

wstr to_wstr(const wchar_t* s, int len) {
  int* ptr = (int *) malloc(sizeof(int) + len * sizeof(wchar_t));
  ptr[0] = len;
  wmemcpy((wchar_t *)&ptr[1], s, len);
  return (void *) ptr;
}

int main() {
  puts("hoge");
  _embind_register_std_string("string", "string");

  EM_VAL alert = _emval_get_global("alert");
  str arg = to_str("abc", 3);
  TYPEID args[1] = {"string"};

  _emval_call(alert, 1, args, &arg);

  return 0;
}

うごいた。