|
@@ -1388,11 +1388,26 @@ static bool map_iterator (gravity_vm *vm, gravity_value_t *args, uint16_t nargs,
|
|
|
|
|
|
static bool range_count (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
static bool range_count (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
#pragma unused(vm, nargs)
|
|
#pragma unused(vm, nargs)
|
|
|
|
+
|
|
gravity_range_t *range = VALUE_AS_RANGE(GET_VALUE(0));
|
|
gravity_range_t *range = VALUE_AS_RANGE(GET_VALUE(0));
|
|
gravity_int_t count = (range->to > range->from) ? (range->to - range->from) : (range->from - range->to);
|
|
gravity_int_t count = (range->to > range->from) ? (range->to - range->from) : (range->from - range->to);
|
|
RETURN_VALUE(VALUE_FROM_INT(count+1), rindex);
|
|
RETURN_VALUE(VALUE_FROM_INT(count+1), rindex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static bool range_from (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
|
|
+ #pragma unused(vm, nargs)
|
|
|
|
+
|
|
|
|
+ gravity_range_t *range = VALUE_AS_RANGE(GET_VALUE(0));
|
|
|
|
+ RETURN_VALUE(VALUE_FROM_INT(range->from), rindex);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static bool range_to (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
|
|
+ #pragma unused(vm, nargs)
|
|
|
|
+
|
|
|
|
+ gravity_range_t *range = VALUE_AS_RANGE(GET_VALUE(0));
|
|
|
|
+ RETURN_VALUE(VALUE_FROM_INT(range->to), rindex);
|
|
|
|
+}
|
|
|
|
+
|
|
static bool range_loop (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
static bool range_loop (gravity_vm *vm, gravity_value_t *args, uint16_t nargs, uint32_t rindex) {
|
|
if (nargs < 2) RETURN_ERROR("Incorrect number of arguments.");
|
|
if (nargs < 2) RETURN_ERROR("Incorrect number of arguments.");
|
|
if (!VALUE_ISA_CLOSURE(GET_VALUE(1))) RETURN_ERROR("Argument must be a Closure.");
|
|
if (!VALUE_ISA_CLOSURE(GET_VALUE(1))) RETURN_ERROR("Argument must be a Closure.");
|
|
@@ -3031,6 +3046,10 @@ void gravity_core_init (void) {
|
|
// RANGE CLASS
|
|
// RANGE CLASS
|
|
closure = computed_property_create(NULL, NEW_FUNCTION(range_count), NULL);
|
|
closure = computed_property_create(NULL, NEW_FUNCTION(range_count), NULL);
|
|
gravity_class_bind(gravity_class_range, "count", VALUE_FROM_OBJECT(closure));
|
|
gravity_class_bind(gravity_class_range, "count", VALUE_FROM_OBJECT(closure));
|
|
|
|
+ closure = computed_property_create(NULL, NEW_FUNCTION(range_from), NULL);
|
|
|
|
+ gravity_class_bind(gravity_class_range, "from", VALUE_FROM_OBJECT(closure));
|
|
|
|
+ closure = computed_property_create(NULL, NEW_FUNCTION(range_to), NULL);
|
|
|
|
+ gravity_class_bind(gravity_class_range, "to", VALUE_FROM_OBJECT(closure));
|
|
gravity_class_bind(gravity_class_range, ITERATOR_INIT_FUNCTION, NEW_CLOSURE_VALUE(range_iterator));
|
|
gravity_class_bind(gravity_class_range, ITERATOR_INIT_FUNCTION, NEW_CLOSURE_VALUE(range_iterator));
|
|
gravity_class_bind(gravity_class_range, ITERATOR_NEXT_FUNCTION, NEW_CLOSURE_VALUE(range_iterator_next));
|
|
gravity_class_bind(gravity_class_range, ITERATOR_NEXT_FUNCTION, NEW_CLOSURE_VALUE(range_iterator_next));
|
|
gravity_class_bind(gravity_class_range, "contains", NEW_CLOSURE_VALUE(range_contains));
|
|
gravity_class_bind(gravity_class_range, "contains", NEW_CLOSURE_VALUE(range_contains));
|