Turn port implementations into proper libraries (#1777)
This commit changes the concept of JerryScript port implementations
from a simple directory of C source files (which get injected among
the sources of `jerry-core`) into a proper static library (which
may be linked to an application together with `jerry-core`). As a
consequence, this commit introduces a new library to the
JerryScript component architecture: the sources of the default port
implementation form `jerry-port-default`.
Changes in more detail:
- The sources in `targets/default` are moved to `jerry-port/default`
and are turned into a proper static library.
- Actually, the default port implementation has two library
variants, one that implements the bare minimum only
(`jerry-port-default-minimal`) and one that has some extra
functionalities specific to this implementation (the "full"
`jerry-port-default`).
- The new libraries have an interface header in
`jerry-port/default/include`, which extends the common
`jerryscript-port.h` API with functions specific to these
libraries.
- All non-standard port functions have now the
`jerry_port_default_` prefix (this affects `jobqueue_init` and
`jobqueue_run`).
- The jobqueue implementation functions became config macro
independent: it is now the responsibility of the linker to pick
the needed objects from the library, and omit those (e.g.,
jobqueue-related code) that are not referenced.
- Build of the libraries can be controlled with the new
`JERRY_PORT_DEFAULT` cmake option.
- The cmake option `PORT_DIR` is dropped, and `PORT_DIR/*.c` is not
appended to `jerry-core` sources.
- Instead, the `jerry` tool of `jerry-main` links to
`jerry-port-default`, while `jerry-minimal` links to
`jerry-port-default-minimal`.
- `tests/unit-core` tests are also linked to
`jerry-port-default-minimal`.
- Tools adapted.
- `build.py` has `--jerry-port-default` instead of `--port-dir`.
- `check-*.sh` have paths updated (`jerry-port/default` instead
of `targets/default`).
- Miscellaneous.
- Dropped `#ifndef`s from `jerryscript-port.h`. It is a public
header of the `jerry-core` library, which means that it must
not contain configuration-dependent parts (once the library is
built with some config macros and the archive and the headers
are installed, there is no way for the header to tell what
those config macrose were).
- Added documentation comments to the JobQueue Port API (in
`jerryscript-port.h`) and to several default port
implementation functions (in `jerry-port/default`).
JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu
This commit is contained in:
@@ -1,67 +0,0 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifdef __GNUC__
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
|
||||
#include "jerryscript-port.h"
|
||||
#include "jerryscript-port-default.h"
|
||||
|
||||
/**
|
||||
* Default implementation of jerry_port_get_time_zone.
|
||||
*/
|
||||
bool jerry_port_get_time_zone (jerry_time_zone_t *tz_p)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
struct timeval tv;
|
||||
struct timezone tz;
|
||||
|
||||
/* gettimeofday may not fill tz, so zero-initializing */
|
||||
tz.tz_minuteswest = 0;
|
||||
tz.tz_dsttime = 0;
|
||||
|
||||
if (gettimeofday (&tv, &tz) != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
tz_p->offset = tz.tz_minuteswest;
|
||||
tz_p->daylight_saving_time = tz.tz_dsttime > 0 ? 1 : 0;
|
||||
|
||||
return true;
|
||||
#else /* !__GNUC__ */
|
||||
return false;
|
||||
#endif /* __GNUC__ */
|
||||
} /* jerry_port_get_time_zone */
|
||||
|
||||
/**
|
||||
* Default implementation of jerry_port_get_current_time.
|
||||
*/
|
||||
double jerry_port_get_current_time (void)
|
||||
{
|
||||
#ifdef __GNUC__
|
||||
struct timeval tv;
|
||||
|
||||
if (gettimeofday (&tv, NULL) != 0)
|
||||
{
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
return ((double) tv.tv_sec) * 1000.0 + ((double) tv.tv_usec) / 1000.0;
|
||||
#else /* __!GNUC__ */
|
||||
return 0.0;
|
||||
#endif /* __GNUC__ */
|
||||
} /* jerry_port_get_current_time */
|
||||
@@ -1,59 +0,0 @@
|
||||
/* 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 <stdlib.h>
|
||||
|
||||
#include "jerryscript-port.h"
|
||||
#include "jerryscript-port-default.h"
|
||||
|
||||
static bool abort_on_fail = false;
|
||||
|
||||
/**
|
||||
* Sets whether 'abort' should be called instead of 'exit' upon exiting with
|
||||
* non-zero exit code in the default implementation of jerry_port_fatal.
|
||||
*/
|
||||
void jerry_port_default_set_abort_on_fail (bool flag) /**< new value of 'abort on fail' flag */
|
||||
{
|
||||
abort_on_fail = flag;
|
||||
} /* jerry_port_default_set_abort_on_fail */
|
||||
|
||||
/**
|
||||
* Check whether 'abort' should be called instead of 'exit' upon exiting with
|
||||
* non-zero exit code in the default implementation of jerry_port_fatal.
|
||||
*
|
||||
* @return true - if 'abort on fail' flag is set,
|
||||
* false - otherwise
|
||||
*/
|
||||
bool jerry_port_default_is_abort_on_fail (void)
|
||||
{
|
||||
return abort_on_fail;
|
||||
} /* jerry_port_default_is_abort_on_fail */
|
||||
|
||||
/**
|
||||
* Default implementation of jerry_port_fatal.
|
||||
*/
|
||||
void jerry_port_fatal (jerry_fatal_code_t code)
|
||||
{
|
||||
if (code != 0
|
||||
&& code != ERR_OUT_OF_MEMORY
|
||||
&& jerry_port_default_is_abort_on_fail ())
|
||||
{
|
||||
abort ();
|
||||
}
|
||||
else
|
||||
{
|
||||
exit (code);
|
||||
}
|
||||
} /* jerry_port_fatal */
|
||||
@@ -1,74 +0,0 @@
|
||||
/* 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 <stdarg.h>
|
||||
|
||||
#include "jerryscript-port.h"
|
||||
#include "jerryscript-port-default.h"
|
||||
|
||||
/**
|
||||
* Actual log level
|
||||
*/
|
||||
static jerry_log_level_t jerry_log_level = JERRY_LOG_LEVEL_ERROR;
|
||||
|
||||
/**
|
||||
* Get the log level
|
||||
*
|
||||
* @return current log level
|
||||
*/
|
||||
jerry_log_level_t
|
||||
jerry_port_default_get_log_level (void)
|
||||
{
|
||||
return jerry_log_level;
|
||||
} /* jerry_port_default_get_log_level */
|
||||
|
||||
/**
|
||||
* Set the log level
|
||||
*/
|
||||
void
|
||||
jerry_port_default_set_log_level (jerry_log_level_t level) /**< log level */
|
||||
{
|
||||
jerry_log_level = level;
|
||||
} /* jerry_port_default_set_log_level */
|
||||
|
||||
/**
|
||||
* Provide console message implementation for the engine.
|
||||
*/
|
||||
void
|
||||
jerry_port_console (const char *format, /**< format string */
|
||||
...) /**< parameters */
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, format);
|
||||
vfprintf (stdout, format, args);
|
||||
va_end (args);
|
||||
} /* jerry_port_console */
|
||||
|
||||
/**
|
||||
* Provide log message implementation for the engine.
|
||||
*/
|
||||
void
|
||||
jerry_port_log (jerry_log_level_t level, /**< log level */
|
||||
const char *format, /**< format string */
|
||||
...) /**< parameters */
|
||||
{
|
||||
if (level <= jerry_log_level)
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, format);
|
||||
vfprintf (stderr, format, args);
|
||||
va_end (args);
|
||||
}
|
||||
} /* jerry_port_log */
|
||||
@@ -1,135 +0,0 @@
|
||||
/* 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 "jerryscript.h"
|
||||
#include "jerryscript-port.h"
|
||||
#include "jerryscript-port-default.h"
|
||||
#include "jmem.h"
|
||||
#include "jrt.h"
|
||||
|
||||
#ifdef JERRY_PORT_ENABLE_JOBQUEUE
|
||||
|
||||
typedef struct jerry_port_queueitem_t jerry_port_queueitem_t;
|
||||
|
||||
/**
|
||||
* Description of the queue item.
|
||||
*/
|
||||
struct jerry_port_queueitem_t
|
||||
{
|
||||
jerry_port_queueitem_t *next_p; /**< points to next item */
|
||||
jerry_job_handler_t handler; /**< the handler for the job*/
|
||||
void *job_p; /**< points to the job */
|
||||
};
|
||||
|
||||
/**
|
||||
* Description of a job queue (FIFO).
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
jerry_port_queueitem_t *head_p; /**< points to the head item of the queue */
|
||||
jerry_port_queueitem_t *tail_p; /**< points to the tail item of the queue*/
|
||||
} jerry_port_jobqueue_t;
|
||||
|
||||
static jerry_port_jobqueue_t queue;
|
||||
|
||||
/**
|
||||
* Initialize the job queue.
|
||||
*/
|
||||
void jerry_port_jobqueue_init (void)
|
||||
{
|
||||
queue.head_p = NULL;
|
||||
queue.tail_p = NULL;
|
||||
} /* jerry_port_jobqueue_init */
|
||||
|
||||
/**
|
||||
* Enqueue a job.
|
||||
*/
|
||||
void jerry_port_jobqueue_enqueue (jerry_job_handler_t handler, /**< the handler for the job */
|
||||
void *job_p) /**< the job */
|
||||
{
|
||||
jerry_port_queueitem_t *item_p = jmem_heap_alloc_block (sizeof (jerry_port_queueitem_t));
|
||||
item_p->job_p = job_p;
|
||||
item_p->handler = handler;
|
||||
item_p->next_p = NULL;
|
||||
|
||||
if (queue.head_p == NULL)
|
||||
{
|
||||
queue.head_p = item_p;
|
||||
queue.tail_p = item_p;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
queue.tail_p->next_p = item_p;
|
||||
queue.tail_p = item_p;
|
||||
} /* jerry_port_jobqueue_enqueue */
|
||||
|
||||
/**
|
||||
* Dequeue and get the job.
|
||||
*
|
||||
* @return pointer to jerry_port_queueitem_t.
|
||||
* It should be freed with jmem_heap_free_block.
|
||||
*/
|
||||
static jerry_port_queueitem_t *
|
||||
jerry_port_jobqueue_dequeue (void)
|
||||
{
|
||||
if (queue.head_p == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
jerry_port_queueitem_t *item_p = queue.head_p;
|
||||
queue.head_p = queue.head_p->next_p;
|
||||
|
||||
return item_p;
|
||||
} /* jerry_port_jobqueue_dequeue */
|
||||
|
||||
/**
|
||||
* Start the jobqueue.
|
||||
*
|
||||
* @return jerry value.
|
||||
* If exception happens in the handler, stop the queue
|
||||
* and return the exception.
|
||||
* Otherwise, return undefined.
|
||||
*/
|
||||
jerry_value_t
|
||||
jerry_port_jobqueue_run (void)
|
||||
{
|
||||
jerry_value_t ret;
|
||||
|
||||
while (true)
|
||||
{
|
||||
jerry_port_queueitem_t *item_p = jerry_port_jobqueue_dequeue ();
|
||||
|
||||
if (item_p == NULL)
|
||||
{
|
||||
return jerry_create_undefined ();
|
||||
}
|
||||
|
||||
void *job_p = item_p->job_p;
|
||||
jerry_job_handler_t handler = item_p->handler;
|
||||
jmem_heap_free_block (item_p, sizeof (jerry_port_queueitem_t));
|
||||
ret = handler (job_p);
|
||||
|
||||
if (jerry_value_has_error_flag (ret))
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
jerry_release_value (ret);
|
||||
}
|
||||
} /* jerry_port_jobqueue_run */
|
||||
|
||||
#endif /* JERRY_PORT_ENABLE_JOBQUEUE */
|
||||
@@ -1,52 +0,0 @@
|
||||
/* 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.
|
||||
*/
|
||||
|
||||
#ifndef JERRYSCRIPT_PORT_DEFAULT_H
|
||||
#define JERRYSCRIPT_PORT_DEFAULT_H
|
||||
|
||||
#include "jerryscript.h"
|
||||
#include "jerryscript-port.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/** \addtogroup jerry_port_default Default Jerry engine port API
|
||||
* These functions are only available if the default port of Jerry is used.
|
||||
* @{
|
||||
*/
|
||||
|
||||
void jerry_port_default_set_abort_on_fail (bool flag);
|
||||
bool jerry_port_default_is_abort_on_fail (void);
|
||||
|
||||
jerry_log_level_t jerry_port_default_get_log_level (void);
|
||||
void jerry_port_default_set_log_level (jerry_log_level_t level);
|
||||
|
||||
#ifdef JERRY_PORT_ENABLE_JOBQUEUE
|
||||
void jerry_port_jobqueue_init (void);
|
||||
jerry_value_t jerry_port_jobqueue_run (void);
|
||||
#endif /* JERRY_PORT_ENABLE_JOBQUEUE */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
#endif /* !JERRYSCRIPT_PORT_DEFAULT_H */
|
||||
Reference in New Issue
Block a user