Skip to content

Commit b96fca7

Browse files
node-api: add napi_create_object_with_properties
1 parent 2388088 commit b96fca7

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

src/js_native_api.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,13 @@ NAPI_EXTERN napi_status NAPI_CDECL napi_object_freeze(napi_env env,
628628
napi_value object);
629629
NAPI_EXTERN napi_status NAPI_CDECL napi_object_seal(napi_env env,
630630
napi_value object);
631+
NAPI_EXTERN napi_status NAPI_CDECL napi_create_object_with_properties(
632+
napi_env env,
633+
napi_value prototype_or_null,
634+
napi_value* property_names,
635+
napi_value* property_values,
636+
size_t property_count,
637+
napi_value* result);
631638
#endif // NAPI_VERSION >= 8
632639

633640
EXTERN_C_END

src/js_native_api_v8.cc

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,6 +1591,56 @@ napi_status NAPI_CDECL napi_create_object(napi_env env, napi_value* result) {
15911591
return napi_clear_last_error(env);
15921592
}
15931593

1594+
napi_status NAPI_CDECL napi_create_object_with_properties(
1595+
napi_env env,
1596+
napi_value prototype_or_null,
1597+
napi_value* property_names,
1598+
napi_value* property_values,
1599+
size_t property_count,
1600+
napi_value* result) {
1601+
CHECK_ENV_NOT_IN_GC(env);
1602+
CHECK_ARG(env, result);
1603+
1604+
if (property_count > 0) {
1605+
CHECK_ARG(env, property_names);
1606+
CHECK_ARG(env, property_values);
1607+
}
1608+
1609+
v8::Local<v8::Value> v8_prototype_or_null =
1610+
v8impl::V8LocalValueFromJsValue(prototype_or_null);
1611+
1612+
v8::Local<v8::Object> obj;
1613+
1614+
if (property_count > 0) {
1615+
v8::LocalVector<v8::Name> v8_names(env->isolate, property_count);
1616+
v8::LocalVector<v8::Value> v8_values(env->isolate, property_count);
1617+
1618+
for (size_t i = 0; i < property_count; i++) {
1619+
v8::Local<v8::Value> name_value =
1620+
v8impl::V8LocalValueFromJsValue(property_names[i]);
1621+
RETURN_STATUS_IF_FALSE(env, name_value->IsName(), napi_name_expected);
1622+
v8_names[i] = name_value.As<v8::Name>();
1623+
v8_values[i] = v8impl::V8LocalValueFromJsValue(property_values[i]);
1624+
}
1625+
1626+
obj = v8::Object::New(env->isolate,
1627+
v8_prototype_or_null,
1628+
v8_names.data(),
1629+
v8_values.data(),
1630+
property_count);
1631+
} else {
1632+
obj = v8::Object::New(env->isolate,
1633+
v8_prototype_or_null,
1634+
nullptr,
1635+
nullptr,
1636+
0);
1637+
}
1638+
1639+
RETURN_STATUS_IF_FALSE(env, !obj.IsEmpty(), napi_generic_failure);
1640+
*result = v8impl::JsValueFromV8LocalValue(obj);
1641+
return napi_clear_last_error(env);
1642+
}
1643+
15941644
napi_status NAPI_CDECL napi_create_array(napi_env env, napi_value* result) {
15951645
CHECK_ENV_NOT_IN_GC(env);
15961646
CHECK_ARG(env, result);

0 commit comments

Comments
 (0)