runtime/js: fix call args value incref
This commit is contained in:
@@ -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;
|
||||||
@@ -141,7 +138,7 @@ EM_VAL llgo_emval_method_call(EM_VAL object, const char* name, EM_VAL args[], in
|
|||||||
ret = _emval_call_method(caller, object, name, &destructors, elements.data());
|
ret = _emval_call_method(caller, object, name, &destructors, elements.data());
|
||||||
} catch(const emscripten::val& jsErr) {
|
} catch(const emscripten::val& jsErr) {
|
||||||
printf("error\n");
|
printf("error\n");
|
||||||
*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();
|
||||||
@@ -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;
|
*error = 1;
|
||||||
ret = _emval_call(caller, fn, &destructors, elements.data());
|
return EM_VAL(internal::_EMVAL_UNDEFINED);
|
||||||
} catch(const emscripten::val& jsErr) {
|
}
|
||||||
*error = 1;
|
return fromGenericWireType<val>(ret).release_ownership();
|
||||||
return EM_VAL(internal::_EMVAL_UNDEFINED);
|
|
||||||
}
|
|
||||||
return fromGenericWireType<val>(ret).release_ownership();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user