Giter Club home page Giter Club logo

Comments (13)

ekibun avatar ekibun commented on May 30, 2024

参考了您的cmake适配了一下mac,但遇到了Promise无法调用then的问题,想请问您遇到的不能eval具体是个什么情况呢,安卓方面是如何解决的
项目是这个https://github.com/ekibun/flutter_qjs/tree/ffi

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

换我的源码quickjs目录,官方缺finalizer

另外promise完了之后要手动调用executePendingjob

请看主目录下main.dart

from quickjs_dart.

ekibun avatar ekibun commented on May 30, 2024

请问具体是哪个finalizer,win上面是正常的,mac上不行,JS_ExecutePendingJob是有调用的

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

我会看看你的tree,然后看下问题

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

请问具体是哪个finalizer,win上面是正常的,mac上不行,JS_ExecutePendingJob是有调用的

有关不能eval:

我使用官方09-06更新的版本无论如何都不能正常eval.

https://github.com/abner/flutter_js/tree/master/android/src/main/c/quickjs

这个库里面的quickjs版本,用它的可以正常eval,后来我对比了diff之后,发现新版缺少了c_function_finalizer
目前没有调查具体这个flutter_js的库使用的是哪个版本的源码

为了顺利开发,我就把它的源码搬过来,没有具体的研究原理。

有关macOS

目前我还没有打算编译过macOS的版本,不清楚跟iOS的差异具体有多大,promise不能调用then,从quickjs的行为上看,应该是JS_ExecutePendingJob没有执行或者执行有问题,或者你可以打个log看看。

另外,因为是异步调用,这里quickjs并没有把队列的api拿出来,也许需要单独做一个promise队列。
从你的tree上看,跟我使用的addCallback的方式不太一样(场景可能不同),我做的是添加一个promise的deffer对象到global,然后再resolve,你可以参考试试看

from quickjs_dart.

ekibun avatar ekibun commented on May 30, 2024

感谢,我试出来了,Release有问题,改成Debug就好了,应该是什么优化导致的。
另外qjs原版是 https://github.com/bellard/quickjs,在macos上我能eval,ios我还没试。

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

感谢,我试出来了,Release有问题,改成Debug就好了,应该是什么优化导致的。
另外qjs原版是 https://github.com/bellard/quickjs,在macos上我能eval,ios我还没试。

试好了请引用一下你的issue在这里 我去看看

from quickjs_dart.

ekibun avatar ekibun commented on May 30, 2024

ios我试了没有发现问题,issue懒得开了,commit到ffi分支了。

eval的是和我自己的需求比较相关,我给所有返回值包了一个Promise.resolve,方便在dart统一处理js里的异步方法(qjs没有提供直接的方法判断是否是promise),我没找到您代码中对应的方法,至于生成Promise可以直接用JS_NewPromiseCapability

还有最后两个问题,make.sh能不能写在podspec里,以及怎么判断是否是simulator(和实机有不同的abi?),我完全不会用mac,虚拟机好卡。。。(注释里标了IOSTODO的是需要在实机和simulator中改的地方)

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

ios我试了没有发现问题,issue懒得开了,commit到ffi分支了。

eval的是和我自己的需求比较相关,我给所有返回值包了一个Promise.resolve,方便在dart统一处理js里的异步方法(qjs没有提供直接的方法判断是否是promise),我没找到您代码中对应的方法,至于生成Promise可以直接用JS_NewPromiseCapability

我在JSEngine里面做的实现,不过是直接eval的promise deffer,后面会改成ffi的api,这里就不展开了

还有最后两个问题,make.sh能不能写在podspec里,以及怎么判断是否是simulator(和实机有不同的abi?),我完全不会用mac,虚拟机好卡。。。(注释里标了IOSTODO的是需要在实机和simulator中改的地方)

make.sh用在podpec我没有试过,你可以尝试,判断是否simulator好像是没有的,确实有不同的abi,但无法在工程代码中判断,智能在编译之前提供。由于ios14的simulator采用的是arm64架构,与之前i386不同,这里跟实机有了冲突,google了一圈有一些方案,但暂时还没有想好编译脚本怎么简要的去实现,回头再看吧。

from quickjs_dart.

ekibun avatar ekibun commented on May 30, 2024

我遇到了和你相似的问题,Android实机上eval会随机失效,排查原因出在js_get_stack_pointer函数上,猜测是由于dart ffi所处的函数栈不确定导致返回的值与初始化时的stack_top相差超过了设置的stack_size,使得eval返回错误。

我做了一个比较trick的修改,在eval之前把stack_top重置,参见:
ekibun/flutter_qjs@ee93418

你可以试试在源码注释掉CONFIG_STACK_CHECK看看是否是相似的问题。

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

我遇到了和你相似的问题,Android实机上eval会随机失效,排查原因出在js_get_stack_pointer函数上,猜测是由于dart ffi所处的函数栈不确定导致返回的值与初始化时的stack_top相差超过了设置的stack_size,使得eval返回错误。

我做了一个比较trick的修改,在eval之前把stack_top重置,参见:
ekibun/flutter_qjs@ee93418

你可以试试在源码注释掉CONFIG_STACK_CHECK看看是否是相似的问题。

感谢你发现的问题,目前我还没有出现随机失败问题,请让我多测试一下你的方案。

from quickjs_dart.

ekibun avatar ekibun commented on May 30, 2024

Seems that the eval function does not work after JSEngine is initialized. Still don't know why, but we can work around by providing global eval function when engine starts, not after. That one time only solution.

我觉得你一开始的问题就是这个原因造成的

我看了一下diff,abner的做法是去掉 CONFIG_STACK_CHECK,所以不会有stack overflow,但是同时会造成js代码存在死循环的递归时候会闪退。可以试试

var a=()=>a();
a();

from quickjs_dart.

neeboo avatar neeboo commented on May 30, 2024

Seems that the eval function does not work after JSEngine is initialized. Still don't know why, but we can work around by providing global eval function when engine starts, not after. That one time only solution.

我觉得你一开始的问题就是这个原因造成的

我看了一下diff,abner的做法是去掉 CONFIG_STACK_CHECK,所以不会有stack overflow,但是同时会造成js代码存在死循环的递归时候会闪退。可以试试

var a=()=>a();
a();

验证了一下,确实有这个问题,我回头更新你的修改

from quickjs_dart.

Related Issues (1)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.