puerts / backend-quickjs

BSD 3-Clause "New" or "Revised" License
14 stars 11 forks source link

class里含set,require时加载失败而且不报错 #8

Closed chexiongsheng closed 10 months ago

chexiongsheng commented 10 months ago

如下代码被require可以重现

"use strict";

class TsTestActor {
    set;
}
chexiongsheng commented 10 months ago

比较奇怪的是上面代码和抛异常完全不同,应该是quickjs的bug:

chexiongsheng commented 10 months ago

应该是我们处理不当导致:

chexiongsheng commented 10 months ago

equire一个直接抛异常的脚本之所以能正常,是因为在cjs脚本并未直接执行,只是生成一个函数,这并不会导致JS_Eval返回异常(JS_EXCEPTION)。

gc_list不为空可以通过修改TryCatch::handleException解决。

void TryCatch::handleException() {
    JS_FreeValueRT(isolate_->runtime_, catched_);
    catched_ = JS_GetException(isolate_->current_context_->context_);
}

但是语法错误仍然往下执行是不符合预期的。

chexiongsheng commented 10 months ago

这问题主要的直接原因还是我们实现不当。 也发现了qjs和v8的差异:开头那js代码在v8不会报语法错误,不知道是v8、qjs、还是es委员会的问题