mirror of
https://github.com/jerryscript-project/jerryscript.git
synced 2025-12-15 16:29:21 +00:00
This extension provides the following facilities: - registering modules, - module resolvers, and - an API for retrieving a module instance given its name. A module is defined as a global static structure containing a pointer to a string which is the name of the module, and a pointer to a function which will be called when an instance of the module is needed. A module resolver is a function that accepts a string holding the name of the module and returns a `jerry_value_t` in an out-parameter and `true` if the module was found, or `false` if it was not. If it returns `true` and the out-parameter has the error flag set then the API will pass it through without caching. This extension provides a built-in module resolver which attempts to load modules that follow the above module definition. The API provided by this extension invokes all module resolvers it receives in sequence to attempt to resolve the name of a single module. After one resolver returns `true` and a `jerry_value_t` that represents the module the API stops iterating over the remaining resolvers and caches the value if its error flag is not set. It then returns the `jerry_value_t`. The API will return a `jerry_value_t` containing an error indicating that the module was not found if it reaches the end of the list of resolvers. The error it returns has an extra property `"moduleName"` the value of which is a string containing the name of the module that the API was asked to resolve. JerryScript-DCO-1.0-Signed-off-by: Gabriel Schulhof gabriel.schulhof@intel.com
71 lines
2.4 KiB
C
71 lines
2.4 KiB
C
/* Copyright JS Foundation and other contributors, http://js.foundation
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#include <string.h>
|
|
|
|
#include "jerryscript.h"
|
|
#include "test-common.h"
|
|
#include "jerryscript-ext/module.h"
|
|
|
|
int
|
|
main (int argc, char **argv)
|
|
{
|
|
(void) argc;
|
|
(void) argv;
|
|
jerry_char_t buffer[256];
|
|
jerry_size_t bytes_copied;
|
|
jerryx_module_resolver_t resolver = jerryx_module_native_resolver;
|
|
|
|
jerry_init (JERRY_INIT_EMPTY);
|
|
|
|
/* Attempt to load a non-existing module. */
|
|
jerry_value_t module = jerryx_module_resolve ((jerry_char_t *) "some-unknown-module-name", &resolver, 1);
|
|
|
|
TEST_ASSERT (jerry_value_has_error_flag (module));
|
|
|
|
/* Retrieve the error message. */
|
|
jerry_value_t prop_name = jerry_create_string ((const jerry_char_t *) "message");
|
|
jerry_value_t prop = jerry_get_property (module, prop_name);
|
|
|
|
/* Assert that the error message is a string with specific contents. */
|
|
TEST_ASSERT (jerry_value_is_string (prop));
|
|
|
|
bytes_copied = jerry_substring_to_utf8_char_buffer (prop, 0, 254, buffer, 256);
|
|
buffer[bytes_copied] = 0;
|
|
TEST_ASSERT (!strcmp ((const char *) buffer, "Module not found"));
|
|
|
|
/* Release the error message property name and value. */
|
|
jerry_release_value (prop);
|
|
jerry_release_value (prop_name);
|
|
|
|
/* Retrieve the moduleName property. */
|
|
prop_name = jerry_create_string ((const jerry_char_t *) "moduleName");
|
|
prop = jerry_get_property (module, prop_name);
|
|
|
|
/* Assert that the moduleName property is a string containing the requested module name. */
|
|
TEST_ASSERT (jerry_value_is_string (prop));
|
|
|
|
bytes_copied = jerry_substring_to_utf8_char_buffer (prop, 0, 254, buffer, 256);
|
|
buffer[bytes_copied] = 0;
|
|
TEST_ASSERT (!strcmp ((const char *) buffer, "some-unknown-module-name"));
|
|
|
|
/* Release everything. */
|
|
jerry_release_value (prop);
|
|
jerry_release_value (prop_name);
|
|
jerry_release_value (module);
|
|
|
|
return 0;
|
|
} /* main */
|