aboutsummaryrefslogtreecommitdiff
path: root/jerry-core
diff options
context:
space:
mode:
authorLászló Langó <llango.u-szeged@partner.samsung.com>2016-02-11 15:14:40 +0000
committerLászló Langó <llango.u-szeged@partner.samsung.com>2016-02-16 14:30:41 +0100
commit1dde5382246c95c92d5d3253ab12e4f163dd16e2 (patch)
treee9fcc61403146565d1ecf28536c5b0929b537982 /jerry-core
parent80811c83324398138a0897e579321bed2fc4b489 (diff)
Check reference count of objects
Throw an error if the object reference count reached the limit. Related issue: #118 JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com
Diffstat (limited to 'jerry-core')
-rw-r--r--jerry-core/config.h2
-rw-r--r--jerry-core/ecma/base/ecma-gc.c11
-rw-r--r--jerry-core/ecma/base/ecma-helpers.c5
-rw-r--r--jerry-core/jerry.h1
-rw-r--r--jerry-core/jrt/jrt-fatals.c5
5 files changed, 20 insertions, 4 deletions
diff --git a/jerry-core/config.h b/jerry-core/config.h
index 37178ffa..7d79dff0 100644
--- a/jerry-core/config.h
+++ b/jerry-core/config.h
@@ -82,6 +82,8 @@
*/
#define CONFIG_ECMA_REFERENCE_COUNTER_WIDTH (10)
+#define CONFIG_ECMA_REFERENCE_COUNTER_LIMIT ((1u << CONFIG_ECMA_REFERENCE_COUNTER_WIDTH) - 1u)
+
/**
* Maximum length of strings' concatenation
*/
diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c
index fb2ab7cc..e319bbe9 100644
--- a/jerry-core/ecma/base/ecma-gc.c
+++ b/jerry-core/ecma/base/ecma-gc.c
@@ -211,7 +211,16 @@ ecma_init_gc_info (ecma_object_t *object_p) /**< object */
void
ecma_ref_object (ecma_object_t *object_p) /**< object */
{
- ecma_gc_set_object_refs (object_p, ecma_gc_get_object_refs (object_p) + 1);
+ uint32_t ref_cnt = ecma_gc_get_object_refs (object_p);
+
+ if (ref_cnt < (uint32_t) CONFIG_ECMA_REFERENCE_COUNTER_LIMIT)
+ {
+ ecma_gc_set_object_refs (object_p, ref_cnt + 1);
+ }
+ else
+ {
+ jerry_fatal (ERR_REF_COUNT_LIMIT);
+ }
} /* ecma_ref_object */
/**
diff --git a/jerry-core/ecma/base/ecma-helpers.c b/jerry-core/ecma/base/ecma-helpers.c
index f8f34bbb..5e83f4ba 100644
--- a/jerry-core/ecma/base/ecma-helpers.c
+++ b/jerry-core/ecma/base/ecma-helpers.c
@@ -1334,11 +1334,10 @@ ecma_get_property_descriptor_from_property (ecma_property_t *prop_p) /**< proper
void
ecma_bytecode_ref (ecma_compiled_code_t *bytecode_p) /**< byte code pointer */
{
- /* Abort program if maximum reference number is reached.
- * Note: This is not tested for objects. */
+ /* Abort program if maximum reference number is reached. */
if ((bytecode_p->status_flags >> ECMA_BYTECODE_REF_SHIFT) >= 0x3ff)
{
- jerry_fatal (ERR_UNIMPLEMENTED_CASE);
+ jerry_fatal (ERR_REF_COUNT_LIMIT);
}
bytecode_p->status_flags = (uint16_t) (bytecode_p->status_flags + (1 << ECMA_BYTECODE_REF_SHIFT));
diff --git a/jerry-core/jerry.h b/jerry-core/jerry.h
index 4551e7d5..f7353035 100644
--- a/jerry-core/jerry.h
+++ b/jerry-core/jerry.h
@@ -50,6 +50,7 @@ typedef enum
{
ERR_OUT_OF_MEMORY = 10,
ERR_SYSCALL = 11,
+ ERR_REF_COUNT_LIMIT = 12,
ERR_UNIMPLEMENTED_CASE = 118,
ERR_FAILED_INTERNAL_ASSERTION = 120
} jerry_fatal_code_t;
diff --git a/jerry-core/jrt/jrt-fatals.c b/jerry-core/jrt/jrt-fatals.c
index b4af3acf..6eeae55b 100644
--- a/jerry-core/jrt/jrt-fatals.c
+++ b/jerry-core/jrt/jrt-fatals.c
@@ -47,6 +47,11 @@ jerry_fatal (jerry_fatal_code_t code) /**< status code */
/* print nothing as it may invoke syscall recursively */
break;
}
+ case ERR_REF_COUNT_LIMIT:
+ {
+ printf ("ERR_REF_COUNT_LIMIT\n");
+ break;
+ }
case ERR_UNIMPLEMENTED_CASE:
{
printf ("ERR_UNIMPLEMENTED_CASE\n");