runtime/js: fix call args value incref

This commit is contained in:
visualfc
2025-07-02 14:36:08 +08:00
parent f2c16beab6
commit 3d41514abd

View File

@@ -122,17 +122,14 @@ bool llgo_emval_equals(EM_VAL first, EM_VAL second) {
EM_VAL llgo_emval_method_call(EM_VAL object, const char* name, EM_VAL args[], int nargs, int *error) { EM_VAL llgo_emval_method_call(EM_VAL object, const char* name, EM_VAL args[], int nargs, int *error) {
std::vector<TYPEID> arr; std::vector<TYPEID> arr;
arr.resize(nargs+1); arr.resize(nargs+1);
std::vector<val> _args;
_args.resize(nargs);
std::vector<GenericWireType> elements; std::vector<GenericWireType> elements;
elements.resize(nargs); elements.resize(nargs);
GenericWireType *cursor = elements.data(); GenericWireType *cursor = elements.data();
arr[0] = typeid_val; arr[0] = typeid_val;
for (int i = 0; i < nargs; i++) { for (int i = 0; i < nargs; i++) {
arr[i+1] = typeid_val; arr[i+1] = typeid_val;
val v = val::take_ownership(args[i]); _emval_incref(args[i]);
_args[i] = v; writeGenericWireTypes(cursor, args[i]);
writeGenericWireTypes(cursor, v);
} }
EM_METHOD_CALLER caller = _emval_get_method_caller(nargs+1,&arr[0],EM_METHOD_CALLER_KIND::FUNCTION); EM_METHOD_CALLER caller = _emval_get_method_caller(nargs+1,&arr[0],EM_METHOD_CALLER_KIND::FUNCTION);
EM_GENERIC_WIRE_TYPE ret; EM_GENERIC_WIRE_TYPE ret;
@@ -153,30 +150,27 @@ FUNCTION = 0,
CONSTRUCTOR = 1, CONSTRUCTOR = 1,
*/ */
EM_VAL llgo_emval_call(EM_VAL fn, EM_VAL args[], int nargs, int kind, int *error) { EM_VAL llgo_emval_call(EM_VAL fn, EM_VAL args[], int nargs, int kind, int *error) {
std::vector<TYPEID> arr; std::vector<TYPEID> arr;
arr.resize(nargs+1); arr.resize(nargs+1);
std::vector<val> _args; std::vector<GenericWireType> elements;
_args.resize(nargs); elements.resize(nargs);
std::vector<GenericWireType> elements; GenericWireType *cursor = elements.data();
elements.resize(nargs); arr[0] = typeid_val;
GenericWireType *cursor = elements.data(); for (int i = 0; i < nargs; i++) {
arr[0] = typeid_val; arr[i+1] = typeid_val;
for (int i = 0; i < nargs; i++) { _emval_incref(args[i]);
arr[i+1] = typeid_val; writeGenericWireTypes(cursor, args[i]);
val v = val::take_ownership(args[i]); }
_args[i] = v; EM_METHOD_CALLER caller = _emval_get_method_caller(nargs+1,&arr[0],EM_METHOD_CALLER_KIND(kind));
writeGenericWireTypes(cursor, v); EM_GENERIC_WIRE_TYPE ret;
} try {
EM_METHOD_CALLER caller = _emval_get_method_caller(nargs+1,&arr[0],EM_METHOD_CALLER_KIND(kind)); EM_DESTRUCTORS destructors = nullptr;
EM_GENERIC_WIRE_TYPE ret; ret = _emval_call(caller, fn, &destructors, elements.data());
try { } catch(const emscripten::val& jsErr) {
EM_DESTRUCTORS destructors = nullptr;
ret = _emval_call(caller, fn, &destructors, elements.data());
} catch(const emscripten::val& jsErr) {
*error = 1; *error = 1;
return EM_VAL(internal::_EMVAL_UNDEFINED); return EM_VAL(internal::_EMVAL_UNDEFINED);
} }
return fromGenericWireType<val>(ret).release_ownership(); return fromGenericWireType<val>(ret).release_ownership();
} }
/* /*