【js引擎】如何使用 quickjs 把一个 js 值转换成 c 字符串

news2025/2/5 9:07:08

开发 js 运行时时,最重要的模块莫过于 console.log 了。有了它,才可以在 js 代码中打印日志。那么如何用 quickjs 引擎实现该模块呢?

实际上 quickjs 已经实现了一个 console 的模块

js_print 实现

其中使用了接口

 str = JS_ToCStringLen(ctx, &len, argv[i]);

但该接口有一定的缺陷。它使用了 ECMAscript 中的标准
在这里插入图片描述
如果打印的是一个 Symbol ,那么将返回异常。quickjs 内部的处理是返回空串。也就是说,Symbol 类型的值是打印不出来的。

样例如下:样例如下

s = Symbol("dxx");
console.log(s);

输出如下

❯ ./qjs print_symbol.js
TypeError: cannot convert symbol to string
    at log (native)
    at <eval> (print_symbol.js:3)

为了将 Symbol 转换成 string,需要调用 Symbol 的 toString 函数。这里有两种办法
方法一:
直接获取 toString 接口

if (JS_IsSymbol(js_value)) {
	JSValue toString = JS_GetPropertyStr(ctx, js_value, "toString");
	JSValue symbol_str = JS_Call(ctx, toString, js_value, 0, NULL);
	str = JS_ToCStringLen(ctx, &len, symbol_str);
	JS_FreeValue(ctx, toString);
	JS_FreeValue(ctx, symbol_str);
}

方法二: 研究后发现不可行,原因如下
另一种是先把 Symbol 转换成 Symbol Object。标准中规定 Object 会自动调用 toString 函数。这种方案不可行。

  1. 因为 quickjs 中把 JS_ToObject 接口定义在 c 文件中,并没有开放给使用者,如果强行使用需要改源码
  2. 标准规定Object在执行到string的类型转换时,需要先调用 toPrimitive 函数,见上面的截图。那么 symbol 仍然还是打印不出来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2056778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】Linux(centos7)安装jdk1.8

第一步&#xff1a;卸载系统自带的JDK rpm -qa|grep java # xxx yyy zzz为你要卸载的插件&#xff0c;插件之间以空格隔开 rpm -e --nodeps xxx yyy zzz 先卸载JDK 第二步&#xff1a;安装JDK1.8 安装JDK rpm -ivh jdk-8u172-linux-x64.rpm 第三步&#xff1a;查看是否安…

基于x86 平台opencv的图像采集和seetaface6的人脸检测功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸检测功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸检测模块从而实现…

特斯拉FSD软件进化史

特斯拉FSD软件进化史 01前言 特斯拉FSD自动驾驶是以摄像头为核心的纯视觉解决方案。 纯视觉方案的最初设计灵感来自对人类视觉的研究&#xff1b;即人眼睛搜集的信息到达视网膜后&#xff0c;经过大脑皮层的多个区域、神经层&#xff0c;最终形成生物视觉&#xff0c;并在脑…

Wyn商业智能助力零售行业数字化决策高效驱动

最新技术资源&#xff08;建议收藏&#xff09; https://www.grapecity.com.cn/resources/ 项目背景及痛点 百利商业的业务覆盖赛格、 SKP、奥莱、王府井等多地区具有代表性的商场&#xff0c;并创立了多个自有品牌。随着新零售模式的兴起&#xff0c;百利商业紧跟时代步伐&am…

集团数字化转型方案(六)

集团数字化转型方案旨在通过引入前沿技术&#xff0c;如人工智能&#xff08;AI&#xff09;、大数据分析、云计算和物联网&#xff08;IoT&#xff09;&#xff0c;全面提升业务运营效率和市场竞争力。该方案首先实现业务流程的自动化&#xff0c;减少人工干预&#xff0c;通过…

python-求距离(赛氪OJ)

[题目描述] 给你一个 1−>n 的排列&#xff0c;现在有一次机会可以交换两个数的位置&#xff0c;求交换后最小值和最大值之间的最大距离是多少&#xff1f;输入格式&#xff1a; 输入共两行。 第一行一个数 n 。 第二行 n 个数表示这个排列。输出格式&#xff1a; 输出一行一…

嵌入式day28

线程退出 ---pthread_exit&#xff08;&#xff09; 线程结束方式&#xff1a; 1.pthread_exit //pthread_join 2.从线程执行函数中return //此时等价于1 3.pthread_cancel //线程可以被取消 4.任何一个线程调用了exit 或者 主线程main函数return…

浮点数的使用

浮点运算 浮点,英文float point,其字面意义就是可以漂移的小数点(浮动的小数点),来表示含有小数的数值。 我们在数学运算中,经常会遇到无限小数,如1/3=0.333333…无限循环,然而计算机存储容量是有限的,需要舍弃掉一些精度,存储近似值。 讨论浮点精度的目的也是在于程…

Python酷库之旅-第三方库Pandas(090)

目录 一、用法精讲 381、pandas.Series.plot方法 381-1、语法 381-2、参数 381-3、功能 381-4、返回值 381-5、说明 381-6、用法 381-6-1、数据准备 381-6-2、代码示例 381-6-3、结果输出 382、 pandas.Series.plot.area方法 382-1、语法 382-2、参数 382-3、功…

嵌入式软件开发学习二:GPIO

Tips&#xff1a; 本文全部的TTL肖特基触发器应该均为施密特触发器&#xff0c;有些忘记改了。 资料来源&#xff1a;[3-1] GPIO输出_哔哩哔哩_bilibili 一、GPIO简介&#xff1a; GPIO&#xff08;General Purpose Input Output&#xff09;是指通用输入输出接口&#xff0c;…

GitLab Merge Request流水线

GitLab Merge Request 流程文档 为了提升代码质量&#xff0c;让开发人员参与代码review&#xff0c;现在输出Merge Request的流程文档&#xff1a; 1.项目创建各自开发者的分支&#xff0c;命名规则是dev_名字首字母&#xff0c;比如我是dev_cwq.然后把本地分支推到远端orgin…

数据库管理-第232期 初探OpenTenBase(20240819)

数据库管理232期 2024-08-19 数据库管理-第232期 初探OpenTenBase&#xff08;20240819&#xff09;1 OpenTenBase简介2 架构介绍3 集群规划4 部署集群4.1 操作系统配置4.2 数据库软件下载与安装4.3 配置集群4.4 分发软件4.5 启动数据库4.6 查看集群状态 5 访问数据库总结 数据…

Java并发常见面试题总结

文章目录 1 多线程1.1 进程、线程和协程的区别&#xff1f;&#x1f525;1.2 Java 线程和操作系统的线程有啥区别&#xff1f;1.3 如何创建线程&#xff1f;&#x1f525;1.4 runnable 和 callable 两个接口创建线程有什么不同呢&#xff1f;&#x1f525;1.5 如何停止一个正在…

2024.8.20

思维导图 C语言中指针数组和数组指针的区别 数组指针本质上是一个指针变量&#xff0c;用于存储整个数组的起始地址&#xff0c;指针每偏移一个单位&#xff0c;内存就会偏移整个数组的容量的大小&#xff0c;一般用于二维数组&#xff0c;二维数组的数组名&#xff0c;本质上是…

【可视化】封装滚动菜单列表组件

源码及源码分析 <template><!-- 滚动菜单的主要容器 --><div class"scrolling-menu"><!-- 如果headers数组有内容&#xff0c;就渲染表头 --><divclass"table-header"v-if"headers.length":style"{ backgroundC…

LLM向量嵌入知多少

向量嵌入是机器学习领域中一项引人入胜且极具实用性的技术。它们构成了众多自然语言处理&#xff08;NLP&#xff09;、推荐系统和搜索算法的基础。如果您曾经使用过推荐引擎、语音助手或语言翻译工具&#xff0c;那么您已经体验过嵌入技术的强大功能。 机器学习算法&#xff0…

如何为您的专用IP地址选择正确的IP SSL证书

随着互联网的不断发展&#xff0c;网站安全变得越来越重要。SSL证书不仅为网站提供了加密通道&#xff0c;还增强了用户对网站的信任感。对于那些使用专用IP地址的网站来说&#xff0c;选择合适的IP SSL证书至关重要。本文将为您详细介绍如何挑选最适合您网站需求的IP SSL证书。…

Cocos Creator2D游戏开发(14)---CocosCreator常用组件详解

Canvas RenderRoot2D 组件所在的节点是 2D 渲染组件数据收集的入口,而 Canvas&#xff08;画布&#xff09; 组件继承自 RenderRoot2D 组件&#xff0c;所以 Canvas 组件也是数据收集入口。所有 2D 渲染元素都必须作为 RenderRoot2D 的子节点才能被渲染。 Canvas还作为屏幕适配…

Web基础、http协议、源码编译构建LAMP

目录 一、DNS与域名 1.1域名概述 1.2域名小结 1.3DNS域名解析 1.4域名 二、网页的概念 1.网页的基本概念 三、web 1.1web概述 1.2渲染过程 1.3web1.0和web2.0 1.4静态页面和动态页面 四、http协议 1.http协议简介 2.cookie和session 2.1cookie 2.2session 3.c…

React学习笔记(一)——react基础

1. React 介绍 1.1 React是什么 React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 1.2 React的优势 相较于传统基于DOM开发的优势&#xff1a; 组件化的开发方式不错的性能 相较于其它前端框架的优势&#xff1a; 丰富的生态跨平台支持 1.3 React的市场…