toCString property

String? get toCString

reference quickjs.h 705 JS_ToCString static inline const Utf8NullTerminated *JS_ToCString(JSContext *ctx, JSValueConst val1) { return JS_ToCStringLen2(ctx, NULL, val1, 0); } 对应 JS_FreeCString, release 请调用 freeCStringPairPtr 释放 _cstrMap 缓存的 native 指针

Implementation

String? get toCString {
  if (isException || isError) {
    Console.error('[toCString] dumpError: ${dumpError()}');
    return null;
  }
  // console('[toCString] tag ${_ref.ref.tag}');
  // cesu8: 1 代表 non-BMP1 codepoints 2 代表 utf-8 序列
  final cstr = JS_ToCStringLen2(_ctx.ref, nullptr, _ref.ref, 1);
  if (cstr == nullptr) {
    // FIXME: Shell: Assertion failed: (p->ref_count == 0), function free_zero_refcount, file quickjs.c, line 5454.
    Console.error('[toCString] JS_ToCStringLen2 == nullptr, ${_ref.ref.tag}');
    return null;
  }
  // exception occurred!
  try {
    final ptr = cstr.cast<Utf8>();
    final str = ptr.toDartString();
    _cstrMap[str] = ptr;
    return str;
  } catch (e, st) {
    _ctx.cleanException();
    Console.error(
      '[toCString] error occurred! ${e.toString()}, ${st.toString()}',
    );
    _ctx.cleanException();
    return null;
  }
}