mirror of
https://github.com/janet-lang/janet
synced 2025-02-12 23:00:02 +00:00
Merge branch 'master' into compile-opt
This commit is contained in:
commit
7c7136fd70
@ -1,7 +1,8 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## Unreleased - ???
|
## 1.30.0 - 2023-08-05
|
||||||
|
- Change indexing of `array/remove` to start from -1 at the end instead of -2.
|
||||||
- Add new string escape sequences `\\a`, `\\b`, `\\?`, and `\\'`.
|
- Add new string escape sequences `\\a`, `\\b`, `\\?`, and `\\'`.
|
||||||
- Fix bug with marshalling channels
|
- Fix bug with marshalling channels
|
||||||
- Add `div` for floored division
|
- Add `div` for floored division
|
||||||
|
8
Makefile
8
Makefile
@ -48,6 +48,7 @@ SONAME_SETTER=-Wl,-soname,
|
|||||||
# For cross compilation
|
# For cross compilation
|
||||||
HOSTCC?=$(CC)
|
HOSTCC?=$(CC)
|
||||||
HOSTAR?=$(AR)
|
HOSTAR?=$(AR)
|
||||||
|
# Symbols are (optionally) removed later, keep -g as default!
|
||||||
CFLAGS?=-O2 -g
|
CFLAGS?=-O2 -g
|
||||||
LDFLAGS?=-rdynamic
|
LDFLAGS?=-rdynamic
|
||||||
RUN:=$(RUN)
|
RUN:=$(RUN)
|
||||||
@ -196,9 +197,9 @@ build/%.bin.o: src/%.c $(JANET_HEADERS) $(JANET_LOCAL_HEADERS) Makefile
|
|||||||
########################
|
########################
|
||||||
|
|
||||||
ifeq ($(UNAME), Darwin)
|
ifeq ($(UNAME), Darwin)
|
||||||
SONAME=libjanet.1.29.dylib
|
SONAME=libjanet.1.30.dylib
|
||||||
else
|
else
|
||||||
SONAME=libjanet.so.1.29
|
SONAME=libjanet.so.1.30
|
||||||
endif
|
endif
|
||||||
|
|
||||||
build/c/shell.c: src/mainclient/shell.c
|
build/c/shell.c: src/mainclient/shell.c
|
||||||
@ -267,6 +268,7 @@ build/janet-%.tar.gz: $(JANET_TARGET) \
|
|||||||
README.md build/c/janet.c build/c/shell.c
|
README.md build/c/janet.c build/c/shell.c
|
||||||
mkdir -p build/$(JANET_DIST_DIR)/bin
|
mkdir -p build/$(JANET_DIST_DIR)/bin
|
||||||
cp $(JANET_TARGET) build/$(JANET_DIST_DIR)/bin/
|
cp $(JANET_TARGET) build/$(JANET_DIST_DIR)/bin/
|
||||||
|
strip -x -S 'build/$(JANET_DIST_DIR)/bin/janet'
|
||||||
mkdir -p build/$(JANET_DIST_DIR)/include
|
mkdir -p build/$(JANET_DIST_DIR)/include
|
||||||
cp build/janet.h build/$(JANET_DIST_DIR)/include/
|
cp build/janet.h build/$(JANET_DIST_DIR)/include/
|
||||||
mkdir -p build/$(JANET_DIST_DIR)/lib/
|
mkdir -p build/$(JANET_DIST_DIR)/lib/
|
||||||
@ -365,7 +367,7 @@ build/janet.tmLanguage: tools/tm_lang_gen.janet $(JANET_TARGET)
|
|||||||
$(RUN) $(JANET_TARGET) $< > $@
|
$(RUN) $(JANET_TARGET) $< > $@
|
||||||
|
|
||||||
compile-commands:
|
compile-commands:
|
||||||
# Requires pip install copmiledb
|
# Requires pip install compiledb
|
||||||
compiledb make
|
compiledb make
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
@ -1,17 +1,25 @@
|
|||||||
(def ir-asm
|
(def ir-asm
|
||||||
@{:instructions
|
@{:instructions
|
||||||
'((prim 0 s32)
|
'((prim 0 s32)
|
||||||
|
(prim 1 f64)
|
||||||
|
(struct 2 0 1)
|
||||||
|
(struct 3)
|
||||||
(bind 0 0)
|
(bind 0 0)
|
||||||
(bind 1 0)
|
(bind 1 0)
|
||||||
(bind 2 0)
|
(bind 2 0)
|
||||||
#(constant 0 10)
|
(bind 3 1)
|
||||||
(constant 1 20)
|
(bind 4 1)
|
||||||
|
(bind 5 1)
|
||||||
|
(constant 0 10)
|
||||||
|
(constant 0 21)
|
||||||
(add 2 1 0)
|
(add 2 1 0)
|
||||||
(return 2))
|
(constant 3 1.77)
|
||||||
|
(call 3 sin 3)
|
||||||
|
(cast 4 2)
|
||||||
|
(add 5 4 3)
|
||||||
|
(return 5))
|
||||||
:parameter-count 0
|
:parameter-count 0
|
||||||
:link-name "main"})
|
:link-name "main"})
|
||||||
|
|
||||||
(def as (sysir/asm ir-asm))
|
(def as (sysir/asm ir-asm))
|
||||||
(print :did-assemble)
|
|
||||||
(os/sleep 0.5)
|
|
||||||
(print (sysir/to-c as))
|
(print (sysir/to-c as))
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
|
|
||||||
project('janet', 'c',
|
project('janet', 'c',
|
||||||
default_options : ['c_std=c99', 'build.c_std=c99', 'b_lundef=false', 'default_library=both'],
|
default_options : ['c_std=c99', 'build.c_std=c99', 'b_lundef=false', 'default_library=both'],
|
||||||
version : '1.29.1')
|
version : '1.30.0')
|
||||||
|
|
||||||
# Global settings
|
# Global settings
|
||||||
janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet')
|
janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet')
|
||||||
|
@ -1007,30 +1007,6 @@
|
|||||||
(map-template :keep res pred ind inds)
|
(map-template :keep res pred ind inds)
|
||||||
res)
|
res)
|
||||||
|
|
||||||
(defn range
|
|
||||||
`Create an array of values [start, end) with a given step.
|
|
||||||
With one argument, returns a range [0, end). With two arguments, returns
|
|
||||||
a range [start, end). With three, returns a range with optional step size.`
|
|
||||||
[& args]
|
|
||||||
(case (length args)
|
|
||||||
1 (do
|
|
||||||
(def [n] args)
|
|
||||||
(def arr (array/new n))
|
|
||||||
(forv i 0 n (put arr i i))
|
|
||||||
arr)
|
|
||||||
2 (do
|
|
||||||
(def [n m] args)
|
|
||||||
(def arr (array/new (- m n)))
|
|
||||||
(forv i n m (put arr (- i n) i))
|
|
||||||
arr)
|
|
||||||
3 (do
|
|
||||||
(def [n m s] args)
|
|
||||||
(cond
|
|
||||||
(zero? s) @[]
|
|
||||||
(neg? s) (seq [i :down [n m (- s)]] i)
|
|
||||||
(seq [i :range [n m s]] i)))
|
|
||||||
(error "expected 1 to 3 arguments to range")))
|
|
||||||
|
|
||||||
(defn find-index
|
(defn find-index
|
||||||
``Find the index of indexed type for which `pred` is true. Returns `dflt` if not found.``
|
``Find the index of indexed type for which `pred` is true. Returns `dflt` if not found.``
|
||||||
[pred ind &opt dflt]
|
[pred ind &opt dflt]
|
||||||
@ -3520,6 +3496,24 @@
|
|||||||
(when-let [constants (dasm :constants)]
|
(when-let [constants (dasm :constants)]
|
||||||
(eprintf " constants: %.4q" constants))
|
(eprintf " constants: %.4q" constants))
|
||||||
(eprintf " slots: %.4q\n" (frame :slots))
|
(eprintf " slots: %.4q\n" (frame :slots))
|
||||||
|
(when-let [src-path (in dasm :source)]
|
||||||
|
(when (and (fexists src-path)
|
||||||
|
sourcemap)
|
||||||
|
(defn dump
|
||||||
|
[src cur]
|
||||||
|
(def offset 5)
|
||||||
|
(def beg (max 1 (- cur offset)))
|
||||||
|
(def lines (array/concat @[""] (string/split "\n" src)))
|
||||||
|
(def end (min (+ cur offset) (length lines)))
|
||||||
|
(def digits (inc (math/floor (math/log10 end))))
|
||||||
|
(def fmt-str (string "%" digits "d: %s"))
|
||||||
|
(for i beg end
|
||||||
|
(eprin " ") # breakpoint someday?
|
||||||
|
(eprin (if (= i cur) "> " " "))
|
||||||
|
(eprintf fmt-str i (get lines i))))
|
||||||
|
(let [[sl _] (sourcemap pc)]
|
||||||
|
(dump (slurp src-path) sl)
|
||||||
|
(eprint))))
|
||||||
(def padding (string/repeat " " 20))
|
(def padding (string/repeat " " 20))
|
||||||
(loop [i :range [0 (length bytecode)]
|
(loop [i :range [0 (length bytecode)]
|
||||||
:let [instr (bytecode i)]]
|
:let [instr (bytecode i)]]
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
#define JANETCONF_H
|
#define JANETCONF_H
|
||||||
|
|
||||||
#define JANET_VERSION_MAJOR 1
|
#define JANET_VERSION_MAJOR 1
|
||||||
#define JANET_VERSION_MINOR 29
|
#define JANET_VERSION_MINOR 30
|
||||||
#define JANET_VERSION_PATCH 1
|
#define JANET_VERSION_PATCH 0
|
||||||
#define JANET_VERSION_EXTRA ""
|
#define JANET_VERSION_EXTRA ""
|
||||||
#define JANET_VERSION "1.29.1"
|
#define JANET_VERSION "1.30.0"
|
||||||
|
|
||||||
/* #define JANET_BUILD "local" */
|
/* #define JANET_BUILD "local" */
|
||||||
|
|
||||||
|
@ -211,7 +211,7 @@ JANET_CORE_FN(cfun_array_slice,
|
|||||||
"Takes a slice of array or tuple from `start` to `end`. The range is half open, "
|
"Takes a slice of array or tuple from `start` to `end`. The range is half open, "
|
||||||
"[start, end). Indexes can also be negative, indicating indexing from the "
|
"[start, end). Indexes can also be negative, indicating indexing from the "
|
||||||
"end of the array. By default, `start` is 0 and `end` is the length of the array. "
|
"end of the array. By default, `start` is 0 and `end` is the length of the array. "
|
||||||
"Note that index -1 is synonymous with index `(length arrtup)` to allow a full "
|
"Note that if the range is negative, it is taken as (start, end] to allow a full "
|
||||||
"negative slice range. Returns a new array.") {
|
"negative slice range. Returns a new array.") {
|
||||||
JanetView view = janet_getindexed(argv, 0);
|
JanetView view = janet_getindexed(argv, 0);
|
||||||
JanetRange range = janet_getslice(argc, argv);
|
JanetRange range = janet_getslice(argc, argv);
|
||||||
@ -259,8 +259,8 @@ JANET_CORE_FN(cfun_array_insert,
|
|||||||
"(array/insert arr at & xs)",
|
"(array/insert arr at & xs)",
|
||||||
"Insert all `xs` into array `arr` at index `at`. `at` should be an integer between "
|
"Insert all `xs` into array `arr` at index `at`. `at` should be an integer between "
|
||||||
"0 and the length of the array. A negative value for `at` will index backwards from "
|
"0 and the length of the array. A negative value for `at` will index backwards from "
|
||||||
"the end of the array, such that inserting at -1 appends to the array. "
|
"the end of the array, inserting after the index such that inserting at -1 appends to "
|
||||||
"Returns the array.") {
|
"the array. Returns the array.") {
|
||||||
size_t chunksize, restsize;
|
size_t chunksize, restsize;
|
||||||
janet_arity(argc, 2, -1);
|
janet_arity(argc, 2, -1);
|
||||||
JanetArray *array = janet_getarray(argv, 0);
|
JanetArray *array = janet_getarray(argv, 0);
|
||||||
@ -297,7 +297,7 @@ JANET_CORE_FN(cfun_array_remove,
|
|||||||
int32_t at = janet_getinteger(argv, 1);
|
int32_t at = janet_getinteger(argv, 1);
|
||||||
int32_t n = 1;
|
int32_t n = 1;
|
||||||
if (at < 0) {
|
if (at < 0) {
|
||||||
at = array->count + at + 1;
|
at = array->count + at;
|
||||||
}
|
}
|
||||||
if (at < 0 || at > array->count)
|
if (at < 0 || at > array->count)
|
||||||
janet_panicf("removal index %d out of range [0,%d]", at, array->count);
|
janet_panicf("removal index %d out of range [0,%d]", at, array->count);
|
||||||
|
@ -138,6 +138,7 @@ static const JanetInstructionDef janet_ops[] = {
|
|||||||
{"sru", JOP_SHIFT_RIGHT_UNSIGNED},
|
{"sru", JOP_SHIFT_RIGHT_UNSIGNED},
|
||||||
{"sruim", JOP_SHIFT_RIGHT_UNSIGNED_IMMEDIATE},
|
{"sruim", JOP_SHIFT_RIGHT_UNSIGNED_IMMEDIATE},
|
||||||
{"sub", JOP_SUBTRACT},
|
{"sub", JOP_SUBTRACT},
|
||||||
|
{"subim", JOP_SUBTRACT_IMMEDIATE},
|
||||||
{"tcall", JOP_TAILCALL},
|
{"tcall", JOP_TAILCALL},
|
||||||
{"tchck", JOP_TYPECHECK}
|
{"tchck", JOP_TYPECHECK}
|
||||||
};
|
};
|
||||||
|
@ -462,13 +462,15 @@ JANET_CORE_FN(cfun_buffer_blit,
|
|||||||
int same_buf = src.bytes == dest->data;
|
int same_buf = src.bytes == dest->data;
|
||||||
int32_t offset_dest = 0;
|
int32_t offset_dest = 0;
|
||||||
int32_t offset_src = 0;
|
int32_t offset_src = 0;
|
||||||
if (argc > 2)
|
if (argc > 2 && !janet_checktype(argv[2], JANET_NIL))
|
||||||
offset_dest = janet_gethalfrange(argv, 2, dest->count, "dest-start");
|
offset_dest = janet_gethalfrange(argv, 2, dest->count, "dest-start");
|
||||||
if (argc > 3)
|
if (argc > 3 && !janet_checktype(argv[3], JANET_NIL))
|
||||||
offset_src = janet_gethalfrange(argv, 3, src.len, "src-start");
|
offset_src = janet_gethalfrange(argv, 3, src.len, "src-start");
|
||||||
int32_t length_src;
|
int32_t length_src;
|
||||||
if (argc > 4) {
|
if (argc > 4) {
|
||||||
int32_t src_end = janet_gethalfrange(argv, 4, src.len, "src-end");
|
int32_t src_end = src.len;
|
||||||
|
if (!janet_checktype(argv[4], JANET_NIL))
|
||||||
|
src_end = janet_gethalfrange(argv, 4, src.len, "src-end");
|
||||||
length_src = src_end - offset_src;
|
length_src = src_end - offset_src;
|
||||||
if (length_src < 0) length_src = 0;
|
if (length_src < 0) length_src = 0;
|
||||||
} else {
|
} else {
|
||||||
|
@ -37,6 +37,7 @@ enum JanetInstructionType janet_instructions[JOP_INSTRUCTION_COUNT] = {
|
|||||||
JINT_0, /* JOP_RETURN_NIL, */
|
JINT_0, /* JOP_RETURN_NIL, */
|
||||||
JINT_SSI, /* JOP_ADD_IMMEDIATE, */
|
JINT_SSI, /* JOP_ADD_IMMEDIATE, */
|
||||||
JINT_SSS, /* JOP_ADD, */
|
JINT_SSS, /* JOP_ADD, */
|
||||||
|
JINT_SSI, /* JOP_SUBTRACT_IMMEDIATE, */
|
||||||
JINT_SSS, /* JOP_SUBTRACT, */
|
JINT_SSS, /* JOP_SUBTRACT, */
|
||||||
JINT_SSI, /* JOP_MULTIPLY_IMMEDIATE, */
|
JINT_SSI, /* JOP_MULTIPLY_IMMEDIATE, */
|
||||||
JINT_SSS, /* JOP_MULTIPLY, */
|
JINT_SSS, /* JOP_MULTIPLY, */
|
||||||
@ -251,6 +252,7 @@ void janet_bytecode_movopt(JanetFuncDef *def) {
|
|||||||
case JOP_SIGNAL:
|
case JOP_SIGNAL:
|
||||||
/* Write A, Read B */
|
/* Write A, Read B */
|
||||||
case JOP_ADD_IMMEDIATE:
|
case JOP_ADD_IMMEDIATE:
|
||||||
|
case JOP_SUBTRACT_IMMEDIATE:
|
||||||
case JOP_MULTIPLY_IMMEDIATE:
|
case JOP_MULTIPLY_IMMEDIATE:
|
||||||
case JOP_DIVIDE_IMMEDIATE:
|
case JOP_DIVIDE_IMMEDIATE:
|
||||||
case JOP_SHIFT_LEFT_IMMEDIATE:
|
case JOP_SHIFT_LEFT_IMMEDIATE:
|
||||||
|
@ -342,6 +342,20 @@ int32_t janet_gethalfrange(const Janet *argv, int32_t n, int32_t length, const c
|
|||||||
return not_raw;
|
return not_raw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t janet_getstartrange(const Janet *argv, int32_t argc, int32_t n, int32_t length) {
|
||||||
|
if (n >= argc || janet_checktype(argv[n], JANET_NIL)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return janet_gethalfrange(argv, n, length, "start");
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t janet_getendrange(const Janet *argv, int32_t argc, int32_t n, int32_t length) {
|
||||||
|
if (n >= argc || janet_checktype(argv[n], JANET_NIL)) {
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
return janet_gethalfrange(argv, n, length, "end");
|
||||||
|
}
|
||||||
|
|
||||||
int32_t janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which) {
|
int32_t janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which) {
|
||||||
int32_t raw = janet_getinteger(argv, n);
|
int32_t raw = janet_getinteger(argv, n);
|
||||||
int32_t not_raw = raw;
|
int32_t not_raw = raw;
|
||||||
@ -394,24 +408,10 @@ JanetRange janet_getslice(int32_t argc, const Janet *argv) {
|
|||||||
janet_arity(argc, 1, 3);
|
janet_arity(argc, 1, 3);
|
||||||
JanetRange range;
|
JanetRange range;
|
||||||
int32_t length = janet_length(argv[0]);
|
int32_t length = janet_length(argv[0]);
|
||||||
if (argc == 1) {
|
range.start = janet_getstartrange(argv, argc, 1, length);
|
||||||
range.start = 0;
|
range.end = janet_getendrange(argv, argc, 2, length);
|
||||||
range.end = length;
|
if (range.end < range.start)
|
||||||
} else if (argc == 2) {
|
range.end = range.start;
|
||||||
range.start = janet_checktype(argv[1], JANET_NIL)
|
|
||||||
? 0
|
|
||||||
: janet_gethalfrange(argv, 1, length, "start");
|
|
||||||
range.end = length;
|
|
||||||
} else {
|
|
||||||
range.start = janet_checktype(argv[1], JANET_NIL)
|
|
||||||
? 0
|
|
||||||
: janet_gethalfrange(argv, 1, length, "start");
|
|
||||||
range.end = janet_checktype(argv[2], JANET_NIL)
|
|
||||||
? length
|
|
||||||
: janet_gethalfrange(argv, 2, length, "end");
|
|
||||||
if (range.end < range.start)
|
|
||||||
range.end = range.start;
|
|
||||||
}
|
|
||||||
return range;
|
return range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -99,7 +99,7 @@ static JanetSlot opfunction(
|
|||||||
static int can_be_imm(Janet x, int8_t *out) {
|
static int can_be_imm(Janet x, int8_t *out) {
|
||||||
if (!janet_checkint(x)) return 0;
|
if (!janet_checkint(x)) return 0;
|
||||||
int32_t integer = janet_unwrap_integer(x);
|
int32_t integer = janet_unwrap_integer(x);
|
||||||
if (integer > 127 || integer < -127) return 0;
|
if (integer > INT8_MAX || integer < INT8_MIN) return 0;
|
||||||
*out = (int8_t) integer;
|
*out = (int8_t) integer;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -121,8 +121,6 @@ static JanetSlot opreduce(
|
|||||||
JanetCompiler *c = opts.compiler;
|
JanetCompiler *c = opts.compiler;
|
||||||
int32_t i, len;
|
int32_t i, len;
|
||||||
int8_t imm = 0;
|
int8_t imm = 0;
|
||||||
int neg = opim < 0;
|
|
||||||
if (opim < 0) opim = -opim;
|
|
||||||
len = janet_v_count(args);
|
len = janet_v_count(args);
|
||||||
JanetSlot t;
|
JanetSlot t;
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
@ -139,13 +137,13 @@ static JanetSlot opreduce(
|
|||||||
}
|
}
|
||||||
t = janetc_gettarget(opts);
|
t = janetc_gettarget(opts);
|
||||||
if (opim && can_slot_be_imm(args[1], &imm)) {
|
if (opim && can_slot_be_imm(args[1], &imm)) {
|
||||||
janetc_emit_ssi(c, opim, t, args[0], neg ? -imm : imm, 1);
|
janetc_emit_ssi(c, opim, t, args[0], imm, 1);
|
||||||
} else {
|
} else {
|
||||||
janetc_emit_sss(c, op, t, args[0], args[1], 1);
|
janetc_emit_sss(c, op, t, args[0], args[1], 1);
|
||||||
}
|
}
|
||||||
for (i = 2; i < len; i++) {
|
for (i = 2; i < len; i++) {
|
||||||
if (opim && can_slot_be_imm(args[i], &imm)) {
|
if (opim && can_slot_be_imm(args[i], &imm)) {
|
||||||
janetc_emit_ssi(c, opim, t, t, neg ? -imm : imm, 1);
|
janetc_emit_ssi(c, opim, t, t, imm, 1);
|
||||||
} else {
|
} else {
|
||||||
janetc_emit_sss(c, op, t, t, args[i], 1);
|
janetc_emit_sss(c, op, t, t, args[i], 1);
|
||||||
}
|
}
|
||||||
@ -260,7 +258,7 @@ static JanetSlot do_add(JanetFopts opts, JanetSlot *args) {
|
|||||||
return opreduce(opts, args, JOP_ADD, JOP_ADD_IMMEDIATE, janet_wrap_integer(0), janet_wrap_integer(0));
|
return opreduce(opts, args, JOP_ADD, JOP_ADD_IMMEDIATE, janet_wrap_integer(0), janet_wrap_integer(0));
|
||||||
}
|
}
|
||||||
static JanetSlot do_sub(JanetFopts opts, JanetSlot *args) {
|
static JanetSlot do_sub(JanetFopts opts, JanetSlot *args) {
|
||||||
return opreduce(opts, args, JOP_SUBTRACT, -JOP_ADD_IMMEDIATE, janet_wrap_integer(0), janet_wrap_integer(0));
|
return opreduce(opts, args, JOP_SUBTRACT, JOP_SUBTRACT_IMMEDIATE, janet_wrap_integer(0), janet_wrap_integer(0));
|
||||||
}
|
}
|
||||||
static JanetSlot do_mul(JanetFopts opts, JanetSlot *args) {
|
static JanetSlot do_mul(JanetFopts opts, JanetSlot *args) {
|
||||||
return opreduce(opts, args, JOP_MULTIPLY, JOP_MULTIPLY_IMMEDIATE, janet_wrap_integer(1), janet_wrap_integer(1));
|
return opreduce(opts, args, JOP_MULTIPLY, JOP_MULTIPLY_IMMEDIATE, janet_wrap_integer(1), janet_wrap_integer(1));
|
||||||
|
@ -426,6 +426,36 @@ JANET_CORE_FN(janet_core_slice,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JANET_CORE_FN(janet_core_range,
|
||||||
|
"(range & args)",
|
||||||
|
"Create an array of values [start, end) with a given step. "
|
||||||
|
"With one argument, returns a range [0, end). With two arguments, returns "
|
||||||
|
"a range [start, end). With three, returns a range with optional step size.") {
|
||||||
|
janet_arity(argc, 1, 3);
|
||||||
|
int32_t start = 0, stop = 0, step = 1, count = 0;
|
||||||
|
if (argc == 3) {
|
||||||
|
start = janet_getinteger(argv, 0);
|
||||||
|
stop = janet_getinteger(argv, 1);
|
||||||
|
step = janet_getinteger(argv, 2);
|
||||||
|
count = (step > 0) ? (stop - start - 1) / step + 1 :
|
||||||
|
((step < 0) ? (stop - start + 1) / step + 1 : 0);
|
||||||
|
} else if (argc == 2) {
|
||||||
|
start = janet_getinteger(argv, 0);
|
||||||
|
stop = janet_getinteger(argv, 1);
|
||||||
|
count = stop - start;
|
||||||
|
} else {
|
||||||
|
stop = janet_getinteger(argv, 0);
|
||||||
|
count = stop;
|
||||||
|
}
|
||||||
|
count = (count > 0) ? count : 0;
|
||||||
|
JanetArray *array = janet_array(count);
|
||||||
|
for (int32_t i = 0; i < count; i++) {
|
||||||
|
array->data[i] = janet_wrap_number(start + i * step);
|
||||||
|
}
|
||||||
|
array->count = count;
|
||||||
|
return janet_wrap_array(array);
|
||||||
|
}
|
||||||
|
|
||||||
JANET_CORE_FN(janet_core_table,
|
JANET_CORE_FN(janet_core_table,
|
||||||
"(table & kvs)",
|
"(table & kvs)",
|
||||||
"Creates a new table from a variadic number of keys and values. "
|
"Creates a new table from a variadic number of keys and values. "
|
||||||
@ -1024,6 +1054,7 @@ static void janet_load_libs(JanetTable *env) {
|
|||||||
JANET_CORE_REG("int?", janet_core_check_int),
|
JANET_CORE_REG("int?", janet_core_check_int),
|
||||||
JANET_CORE_REG("nat?", janet_core_check_nat),
|
JANET_CORE_REG("nat?", janet_core_check_nat),
|
||||||
JANET_CORE_REG("slice", janet_core_slice),
|
JANET_CORE_REG("slice", janet_core_slice),
|
||||||
|
JANET_CORE_REG("range", janet_core_range),
|
||||||
JANET_CORE_REG("signal", janet_core_signal),
|
JANET_CORE_REG("signal", janet_core_signal),
|
||||||
JANET_CORE_REG("memcmp", janet_core_memcmp),
|
JANET_CORE_REG("memcmp", janet_core_memcmp),
|
||||||
JANET_CORE_REG("getproto", janet_core_getproto),
|
JANET_CORE_REG("getproto", janet_core_getproto),
|
||||||
|
@ -118,10 +118,9 @@ int64_t janet_unwrap_s64(Janet x) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case JANET_NUMBER : {
|
case JANET_NUMBER : {
|
||||||
double dbl = janet_unwrap_number(x);
|
double d = janet_unwrap_number(x);
|
||||||
if (fabs(dbl) <= MAX_INT_IN_DBL)
|
if (!janet_checkint64range(d)) break;
|
||||||
return (int64_t)dbl;
|
return (int64_t) d;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case JANET_STRING: {
|
case JANET_STRING: {
|
||||||
int64_t value;
|
int64_t value;
|
||||||
@ -147,12 +146,9 @@ uint64_t janet_unwrap_u64(Janet x) {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
case JANET_NUMBER : {
|
case JANET_NUMBER : {
|
||||||
double dbl = janet_unwrap_number(x);
|
double d = janet_unwrap_number(x);
|
||||||
/* Allow negative values to be cast to "wrap around".
|
if (!janet_checkuint64range(d)) break;
|
||||||
* This let's addition and subtraction work as expected. */
|
return (uint64_t) d;
|
||||||
if (fabs(dbl) <= MAX_INT_IN_DBL)
|
|
||||||
return (uint64_t)dbl;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case JANET_STRING: {
|
case JANET_STRING: {
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
@ -307,8 +303,8 @@ static int compare_double_double(double x, double y) {
|
|||||||
|
|
||||||
static int compare_int64_double(int64_t x, double y) {
|
static int compare_int64_double(int64_t x, double y) {
|
||||||
if (isnan(y)) {
|
if (isnan(y)) {
|
||||||
return 0; // clojure and python do this
|
return 0;
|
||||||
} else if ((y > (- ((double) MAX_INT_IN_DBL))) && (y < ((double) MAX_INT_IN_DBL))) {
|
} else if ((y > JANET_INTMIN_DOUBLE) && (y < JANET_INTMAX_DOUBLE)) {
|
||||||
double dx = (double) x;
|
double dx = (double) x;
|
||||||
return compare_double_double(dx, y);
|
return compare_double_double(dx, y);
|
||||||
} else if (y > ((double) INT64_MAX)) {
|
} else if (y > ((double) INT64_MAX)) {
|
||||||
@ -323,10 +319,10 @@ static int compare_int64_double(int64_t x, double y) {
|
|||||||
|
|
||||||
static int compare_uint64_double(uint64_t x, double y) {
|
static int compare_uint64_double(uint64_t x, double y) {
|
||||||
if (isnan(y)) {
|
if (isnan(y)) {
|
||||||
return 0; // clojure and python do this
|
return 0;
|
||||||
} else if (y < 0) {
|
} else if (y < 0) {
|
||||||
return 1;
|
return 1;
|
||||||
} else if ((y >= 0) && (y < ((double) MAX_INT_IN_DBL))) {
|
} else if ((y >= 0) && (y < JANET_INTMAX_DOUBLE)) {
|
||||||
double dx = (double) x;
|
double dx = (double) x;
|
||||||
return compare_double_double(dx, y);
|
return compare_double_double(dx, y);
|
||||||
} else if (y > ((double) UINT64_MAX)) {
|
} else if (y > ((double) UINT64_MAX)) {
|
||||||
@ -339,8 +335,9 @@ static int compare_uint64_double(uint64_t x, double y) {
|
|||||||
|
|
||||||
static Janet cfun_it_s64_compare(int32_t argc, Janet *argv) {
|
static Janet cfun_it_s64_compare(int32_t argc, Janet *argv) {
|
||||||
janet_fixarity(argc, 2);
|
janet_fixarity(argc, 2);
|
||||||
if (janet_is_int(argv[0]) != JANET_INT_S64)
|
if (janet_is_int(argv[0]) != JANET_INT_S64) {
|
||||||
janet_panic("compare method requires int/s64 as first argument");
|
janet_panic("compare method requires int/s64 as first argument");
|
||||||
|
}
|
||||||
int64_t x = janet_unwrap_s64(argv[0]);
|
int64_t x = janet_unwrap_s64(argv[0]);
|
||||||
switch (janet_type(argv[1])) {
|
switch (janet_type(argv[1])) {
|
||||||
default:
|
default:
|
||||||
@ -355,7 +352,6 @@ static Janet cfun_it_s64_compare(int32_t argc, Janet *argv) {
|
|||||||
int64_t y = *(int64_t *)abst;
|
int64_t y = *(int64_t *)abst;
|
||||||
return janet_wrap_number((x < y) ? -1 : (x > y ? 1 : 0));
|
return janet_wrap_number((x < y) ? -1 : (x > y ? 1 : 0));
|
||||||
} else if (janet_abstract_type(abst) == &janet_u64_type) {
|
} else if (janet_abstract_type(abst) == &janet_u64_type) {
|
||||||
// comparing signed to unsigned -- be careful!
|
|
||||||
uint64_t y = *(uint64_t *)abst;
|
uint64_t y = *(uint64_t *)abst;
|
||||||
if (x < 0) {
|
if (x < 0) {
|
||||||
return janet_wrap_number(-1);
|
return janet_wrap_number(-1);
|
||||||
@ -374,8 +370,9 @@ static Janet cfun_it_s64_compare(int32_t argc, Janet *argv) {
|
|||||||
|
|
||||||
static Janet cfun_it_u64_compare(int32_t argc, Janet *argv) {
|
static Janet cfun_it_u64_compare(int32_t argc, Janet *argv) {
|
||||||
janet_fixarity(argc, 2);
|
janet_fixarity(argc, 2);
|
||||||
if (janet_is_int(argv[0]) != JANET_INT_U64) // is this needed?
|
if (janet_is_int(argv[0]) != JANET_INT_U64) {
|
||||||
janet_panic("compare method requires int/u64 as first argument");
|
janet_panic("compare method requires int/u64 as first argument");
|
||||||
|
}
|
||||||
uint64_t x = janet_unwrap_u64(argv[0]);
|
uint64_t x = janet_unwrap_u64(argv[0]);
|
||||||
switch (janet_type(argv[1])) {
|
switch (janet_type(argv[1])) {
|
||||||
default:
|
default:
|
||||||
@ -390,7 +387,6 @@ static Janet cfun_it_u64_compare(int32_t argc, Janet *argv) {
|
|||||||
uint64_t y = *(uint64_t *)abst;
|
uint64_t y = *(uint64_t *)abst;
|
||||||
return janet_wrap_number((x < y) ? -1 : (x > y ? 1 : 0));
|
return janet_wrap_number((x < y) ? -1 : (x > y ? 1 : 0));
|
||||||
} else if (janet_abstract_type(abst) == &janet_s64_type) {
|
} else if (janet_abstract_type(abst) == &janet_s64_type) {
|
||||||
// comparing unsigned to signed -- be careful!
|
|
||||||
int64_t y = *(int64_t *)abst;
|
int64_t y = *(int64_t *)abst;
|
||||||
if (y < 0) {
|
if (y < 0) {
|
||||||
return janet_wrap_number(1);
|
return janet_wrap_number(1);
|
||||||
|
@ -143,7 +143,8 @@ JANET_CORE_FN(cfun_io_fopen,
|
|||||||
"Following one of the initial flags, 0 or more of the following flags can be appended:\n\n"
|
"Following one of the initial flags, 0 or more of the following flags can be appended:\n\n"
|
||||||
"* b - open the file in binary mode (rather than text mode)\n\n"
|
"* b - open the file in binary mode (rather than text mode)\n\n"
|
||||||
"* + - append to the file instead of overwriting it\n\n"
|
"* + - append to the file instead of overwriting it\n\n"
|
||||||
"* n - error if the file cannot be opened instead of returning nil") {
|
"* n - error if the file cannot be opened instead of returning nil\n\n"
|
||||||
|
"See fopen (<stdio.h>, C99) for further details.") {
|
||||||
janet_arity(argc, 1, 2);
|
janet_arity(argc, 1, 2);
|
||||||
const uint8_t *fname = janet_getstring(argv, 0);
|
const uint8_t *fname = janet_getstring(argv, 0);
|
||||||
const uint8_t *fmode;
|
const uint8_t *fmode;
|
||||||
|
@ -175,8 +175,9 @@ JANET_CORE_FN(cfun_string_slice,
|
|||||||
"Returns a substring from a byte sequence. The substring is from "
|
"Returns a substring from a byte sequence. The substring is from "
|
||||||
"index `start` inclusive to index `end`, exclusive. All indexing "
|
"index `start` inclusive to index `end`, exclusive. All indexing "
|
||||||
"is from 0. `start` and `end` can also be negative to indicate indexing "
|
"is from 0. `start` and `end` can also be negative to indicate indexing "
|
||||||
"from the end of the string. Note that index -1 is synonymous with "
|
"from the end of the string. Note that if `start` is negative it is "
|
||||||
"index `(length bytes)` to allow a full negative slice range. ") {
|
"exclusive, and if `end` is negative it is inclusive, to allow a full "
|
||||||
|
"negative slice range.") {
|
||||||
JanetByteView view = janet_getbytes(argv, 0);
|
JanetByteView view = janet_getbytes(argv, 0);
|
||||||
JanetRange range = janet_getslice(argc, argv);
|
JanetRange range = janet_getslice(argc, argv);
|
||||||
return janet_stringv(view.bytes + range.start, range.end - range.start);
|
return janet_stringv(view.bytes + range.start, range.end - range.start);
|
||||||
|
@ -51,7 +51,8 @@ typedef enum {
|
|||||||
JANET_PRIM_F32,
|
JANET_PRIM_F32,
|
||||||
JANET_PRIM_F64,
|
JANET_PRIM_F64,
|
||||||
JANET_PRIM_POINTER,
|
JANET_PRIM_POINTER,
|
||||||
JANET_PRIM_BOOLEAN
|
JANET_PRIM_BOOLEAN,
|
||||||
|
JANET_PRIM_STRUCT,
|
||||||
} JanetPrim;
|
} JanetPrim;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -74,21 +75,6 @@ static const JanetPrimName prim_names[] = {
|
|||||||
{"u8", JANET_PRIM_U8},
|
{"u8", JANET_PRIM_U8},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *prim_names_by_id[] = {
|
|
||||||
"u8",
|
|
||||||
"s8",
|
|
||||||
"u16",
|
|
||||||
"s16",
|
|
||||||
"u32",
|
|
||||||
"s32",
|
|
||||||
"u64",
|
|
||||||
"s64",
|
|
||||||
"f32",
|
|
||||||
"f64",
|
|
||||||
"pointer",
|
|
||||||
"boolean",
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
JANET_SYSOP_MOVE,
|
JANET_SYSOP_MOVE,
|
||||||
JANET_SYSOP_CAST,
|
JANET_SYSOP_CAST,
|
||||||
@ -120,7 +106,9 @@ typedef enum {
|
|||||||
JANET_SYSOP_TYPE_PRIMITIVE,
|
JANET_SYSOP_TYPE_PRIMITIVE,
|
||||||
JANET_SYSOP_TYPE_STRUCT,
|
JANET_SYSOP_TYPE_STRUCT,
|
||||||
JANET_SYSOP_TYPE_BIND,
|
JANET_SYSOP_TYPE_BIND,
|
||||||
JANET_SYSOP_ARG
|
JANET_SYSOP_ARG,
|
||||||
|
JANET_SYSOP_FIELD_GET,
|
||||||
|
JANET_SYSOP_FIELD_SET,
|
||||||
} JanetSysOp;
|
} JanetSysOp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -142,6 +130,8 @@ static const JanetSysInstrName sys_op_names[] = {
|
|||||||
{"constant", JANET_SYSOP_CONSTANT},
|
{"constant", JANET_SYSOP_CONSTANT},
|
||||||
{"divide", JANET_SYSOP_DIVIDE},
|
{"divide", JANET_SYSOP_DIVIDE},
|
||||||
{"eq", JANET_SYSOP_EQ},
|
{"eq", JANET_SYSOP_EQ},
|
||||||
|
{"fget", JANET_SYSOP_FIELD_GET},
|
||||||
|
{"fset", JANET_SYSOP_FIELD_SET},
|
||||||
{"gt", JANET_SYSOP_GT},
|
{"gt", JANET_SYSOP_GT},
|
||||||
{"gte", JANET_SYSOP_GTE},
|
{"gte", JANET_SYSOP_GTE},
|
||||||
{"jump", JANET_SYSOP_JUMP},
|
{"jump", JANET_SYSOP_JUMP},
|
||||||
@ -161,8 +151,8 @@ static const JanetSysInstrName sys_op_names[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
size_t field_count;
|
|
||||||
JanetPrim prim;
|
JanetPrim prim;
|
||||||
|
uint32_t field_count;
|
||||||
} JanetSysTypeInfo;
|
} JanetSysTypeInfo;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -371,7 +361,7 @@ static void janet_sysir_init_instructions(JanetSysIR *out, JanetView instruction
|
|||||||
} else {
|
} else {
|
||||||
instruction.call.callee = instr_read_operand(tuple[2], out);
|
instruction.call.callee = instr_read_operand(tuple[2], out);
|
||||||
}
|
}
|
||||||
instruction.call.arg_count = janet_tuple_length(tuple) - 2;
|
instruction.call.arg_count = janet_tuple_length(tuple) - 3;
|
||||||
ir[cursor++] = instruction;
|
ir[cursor++] = instruction;
|
||||||
for (int32_t j = 3; j < janet_tuple_length(tuple); j += 3) {
|
for (int32_t j = 3; j < janet_tuple_length(tuple); j += 3) {
|
||||||
JanetSysInstruction arginstr;
|
JanetSysInstruction arginstr;
|
||||||
@ -439,9 +429,9 @@ static void janet_sysir_init_instructions(JanetSysIR *out, JanetView instruction
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case JANET_SYSOP_TYPE_STRUCT: {
|
case JANET_SYSOP_TYPE_STRUCT: {
|
||||||
instr_assert_length(tuple, 1, opvalue);
|
instr_assert_min_length(tuple, 1, opvalue);
|
||||||
instruction.type_types.dest_type = instr_read_type_operand(tuple[1], out);
|
instruction.type_types.dest_type = instr_read_type_operand(tuple[1], out);
|
||||||
instruction.type_types.arg_count = janet_tuple_length(tuple) - 1;
|
instruction.type_types.arg_count = janet_tuple_length(tuple) - 2;
|
||||||
ir[cursor++] = instruction;
|
ir[cursor++] = instruction;
|
||||||
for (int32_t j = 2; j < janet_tuple_length(tuple); j += 3) {
|
for (int32_t j = 2; j < janet_tuple_length(tuple); j += 3) {
|
||||||
JanetSysInstruction arginstr;
|
JanetSysInstruction arginstr;
|
||||||
@ -458,7 +448,6 @@ static void janet_sysir_init_instructions(JanetSysIR *out, JanetView instruction
|
|||||||
}
|
}
|
||||||
ir[cursor++] = arginstr;
|
ir[cursor++] = arginstr;
|
||||||
}
|
}
|
||||||
ir[cursor++] = instruction;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case JANET_SYSOP_TYPE_BIND: {
|
case JANET_SYSOP_TYPE_BIND: {
|
||||||
@ -505,7 +494,7 @@ static void janet_sysir_init_types(JanetSysIR *sysir) {
|
|||||||
sysir->types = types;
|
sysir->types = types;
|
||||||
sysir->type_defs[0].field_count = 0;
|
sysir->type_defs[0].field_count = 0;
|
||||||
sysir->type_defs[0].prim = JANET_PRIM_S32;
|
sysir->type_defs[0].prim = JANET_PRIM_S32;
|
||||||
for (uint32_t i = 0; i < sysir->instruction_count; i++) {
|
for (uint32_t i = 0; i < sysir->register_count; i++) {
|
||||||
sysir->types[i] = 0;
|
sysir->types[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -523,7 +512,7 @@ static void janet_sysir_init_types(JanetSysIR *sysir) {
|
|||||||
case JANET_SYSOP_TYPE_STRUCT: {
|
case JANET_SYSOP_TYPE_STRUCT: {
|
||||||
uint32_t type_def = instruction.type_types.dest_type;
|
uint32_t type_def = instruction.type_types.dest_type;
|
||||||
type_defs[type_def].field_count = 0; /* TODO */
|
type_defs[type_def].field_count = 0; /* TODO */
|
||||||
type_defs[type_def].prim = JANET_PRIM_POINTER; /* TODO */
|
type_defs[type_def].prim = JANET_PRIM_STRUCT;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case JANET_SYSOP_TYPE_BIND: {
|
case JANET_SYSOP_TYPE_BIND: {
|
||||||
@ -849,7 +838,7 @@ void janet_sys_ir_lower_to_c(JanetSysIR *ir, JanetBuffer *buffer) {
|
|||||||
janet_formatb(buffer, ");\n");
|
janet_formatb(buffer, ");\n");
|
||||||
break;
|
break;
|
||||||
case JANET_SYSOP_CALLK:
|
case JANET_SYSOP_CALLK:
|
||||||
janet_formatb(buffer, "_r%u = %j(", instruction.callk.dest, instruction.callk.constant);
|
janet_formatb(buffer, "_r%u = %j(", instruction.callk.dest, ir->constants[instruction.callk.constant]);
|
||||||
for (uint32_t j = 0; j < instruction.callk.arg_count; j++) {
|
for (uint32_t j = 0; j < instruction.callk.arg_count; j++) {
|
||||||
uint32_t offset = j / 3 + 1;
|
uint32_t offset = j / 3 + 1;
|
||||||
uint32_t index = j % 3;
|
uint32_t index = j % 3;
|
||||||
|
@ -69,9 +69,9 @@ JANET_CORE_FN(cfun_tuple_slice,
|
|||||||
"inclusive to index `end` exclusive. If `start` or `end` are not provided, "
|
"inclusive to index `end` exclusive. If `start` or `end` are not provided, "
|
||||||
"they default to 0 and the length of `arrtup`, respectively. "
|
"they default to 0 and the length of `arrtup`, respectively. "
|
||||||
"`start` and `end` can also be negative to indicate indexing "
|
"`start` and `end` can also be negative to indicate indexing "
|
||||||
"from the end of the input. Note that index -1 is synonymous with "
|
"from the end of the input. Note that if `start` is negative it is "
|
||||||
"index `(length arrtup)` to allow a full negative slice range. "
|
"exclusive, and if `end` is negative it is inclusive, to allow a full "
|
||||||
"Returns the new tuple.") {
|
"negative slice range. Returns the new tuple.") {
|
||||||
JanetView view = janet_getindexed(argv, 0);
|
JanetView view = janet_getindexed(argv, 0);
|
||||||
JanetRange range = janet_getslice(argc, argv);
|
JanetRange range = janet_getslice(argc, argv);
|
||||||
return janet_wrap_tuple(janet_tuple_n(view.items + range.start, range.end - range.start));
|
return janet_wrap_tuple(janet_tuple_n(view.items + range.start, range.end - range.start));
|
||||||
|
@ -347,6 +347,7 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) {
|
|||||||
&&label_JOP_RETURN_NIL,
|
&&label_JOP_RETURN_NIL,
|
||||||
&&label_JOP_ADD_IMMEDIATE,
|
&&label_JOP_ADD_IMMEDIATE,
|
||||||
&&label_JOP_ADD,
|
&&label_JOP_ADD,
|
||||||
|
&&label_JOP_SUBTRACT_IMMEDIATE,
|
||||||
&&label_JOP_SUBTRACT,
|
&&label_JOP_SUBTRACT,
|
||||||
&&label_JOP_MULTIPLY_IMMEDIATE,
|
&&label_JOP_MULTIPLY_IMMEDIATE,
|
||||||
&&label_JOP_MULTIPLY,
|
&&label_JOP_MULTIPLY,
|
||||||
@ -593,7 +594,6 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) {
|
|||||||
&&label_unknown_op,
|
&&label_unknown_op,
|
||||||
&&label_unknown_op,
|
&&label_unknown_op,
|
||||||
&&label_unknown_op,
|
&&label_unknown_op,
|
||||||
&&label_unknown_op,
|
|
||||||
&&label_unknown_op
|
&&label_unknown_op
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -683,6 +683,9 @@ static JanetSignal run_vm(JanetFiber *fiber, Janet in) {
|
|||||||
VM_OP(JOP_ADD)
|
VM_OP(JOP_ADD)
|
||||||
vm_binop(+);
|
vm_binop(+);
|
||||||
|
|
||||||
|
VM_OP(JOP_SUBTRACT_IMMEDIATE)
|
||||||
|
vm_binop_immediate(-);
|
||||||
|
|
||||||
VM_OP(JOP_SUBTRACT)
|
VM_OP(JOP_SUBTRACT)
|
||||||
vm_binop(-);
|
vm_binop(-);
|
||||||
|
|
||||||
|
@ -1262,6 +1262,7 @@ enum JanetOpCode {
|
|||||||
JOP_RETURN_NIL,
|
JOP_RETURN_NIL,
|
||||||
JOP_ADD_IMMEDIATE,
|
JOP_ADD_IMMEDIATE,
|
||||||
JOP_ADD,
|
JOP_ADD,
|
||||||
|
JOP_SUBTRACT_IMMEDIATE,
|
||||||
JOP_SUBTRACT,
|
JOP_SUBTRACT,
|
||||||
JOP_MULTIPLY_IMMEDIATE,
|
JOP_MULTIPLY_IMMEDIATE,
|
||||||
JOP_MULTIPLY,
|
JOP_MULTIPLY,
|
||||||
@ -1996,6 +1997,8 @@ JANET_API JanetDictView janet_getdictionary(const Janet *argv, int32_t n);
|
|||||||
JANET_API void *janet_getabstract(const Janet *argv, int32_t n, const JanetAbstractType *at);
|
JANET_API void *janet_getabstract(const Janet *argv, int32_t n, const JanetAbstractType *at);
|
||||||
JANET_API JanetRange janet_getslice(int32_t argc, const Janet *argv);
|
JANET_API JanetRange janet_getslice(int32_t argc, const Janet *argv);
|
||||||
JANET_API int32_t janet_gethalfrange(const Janet *argv, int32_t n, int32_t length, const char *which);
|
JANET_API int32_t janet_gethalfrange(const Janet *argv, int32_t n, int32_t length, const char *which);
|
||||||
|
JANET_API int32_t janet_getstartrange(const Janet *argv, int32_t argc, int32_t n, int32_t length);
|
||||||
|
JANET_API int32_t janet_getendrange(const Janet *argv, int32_t argc, int32_t n, int32_t length);
|
||||||
JANET_API int32_t janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which);
|
JANET_API int32_t janet_getargindex(const Janet *argv, int32_t n, int32_t length, const char *which);
|
||||||
JANET_API uint64_t janet_getflags(const Janet *argv, int32_t n, const char *flags);
|
JANET_API uint64_t janet_getflags(const Janet *argv, int32_t n, const char *flags);
|
||||||
|
|
||||||
|
24
temp.c
Normal file
24
temp.c
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#line 3
|
||||||
|
typedef int32_t _t0;
|
||||||
|
_t0 main()
|
||||||
|
{
|
||||||
|
_t0 _r0;
|
||||||
|
_t0 _r1;
|
||||||
|
_t0 _r2;
|
||||||
|
|
||||||
|
_i4:
|
||||||
|
#line 7
|
||||||
|
_r0 = (_t0) 10;
|
||||||
|
_i5:
|
||||||
|
#line 8
|
||||||
|
_r1 = (_t0) 20;
|
||||||
|
_i6:
|
||||||
|
#line 9
|
||||||
|
_r2 = _r1 + _r0;
|
||||||
|
_i7:
|
||||||
|
#line 10
|
||||||
|
return _r2;
|
||||||
|
}
|
||||||
|
|
@ -44,7 +44,7 @@
|
|||||||
(assert (deep= (array/remove @[1 2 3 4 5] 2) @[1 2 4 5]) "array/remove 1")
|
(assert (deep= (array/remove @[1 2 3 4 5] 2) @[1 2 4 5]) "array/remove 1")
|
||||||
(assert (deep= (array/remove @[1 2 3 4 5] 2 2) @[1 2 5]) "array/remove 2")
|
(assert (deep= (array/remove @[1 2 3 4 5] 2 2) @[1 2 5]) "array/remove 2")
|
||||||
(assert (deep= (array/remove @[1 2 3 4 5] 2 200) @[1 2]) "array/remove 3")
|
(assert (deep= (array/remove @[1 2 3 4 5] 2 200) @[1 2]) "array/remove 3")
|
||||||
(assert (deep= (array/remove @[1 2 3 4 5] -3 200) @[1 2 3]) "array/remove 4")
|
(assert (deep= (array/remove @[1 2 3 4 5] -2 200) @[1 2 3]) "array/remove 4")
|
||||||
|
|
||||||
|
|
||||||
# array/peek
|
# array/peek
|
||||||
|
@ -362,14 +362,7 @@
|
|||||||
(assert (= false (and false false)) "and 1")
|
(assert (= false (and false false)) "and 1")
|
||||||
(assert (= false (or false false)) "or 1")
|
(assert (= false (or false false)) "or 1")
|
||||||
|
|
||||||
# Range
|
|
||||||
# a982f351d
|
|
||||||
(assert (deep= (range 10) @[0 1 2 3 4 5 6 7 8 9]) "range 1 argument")
|
|
||||||
(assert (deep= (range 5 10) @[5 6 7 8 9]) "range 2 arguments")
|
|
||||||
(assert (deep= (range 5 10 2) @[5 7 9]) "range 3 arguments")
|
|
||||||
# 11cd1279d
|
# 11cd1279d
|
||||||
(assert (= (length (range 10)) 10) "(range 10)")
|
|
||||||
(assert (= (length (range 1 10)) 9) "(range 1 10)")
|
|
||||||
(assert (deep= @{:a 1 :b 2 :c 3} (zipcoll '[:a :b :c] '[1 2 3])) "zipcoll")
|
(assert (deep= @{:a 1 :b 2 :c 3} (zipcoll '[:a :b :c] '[1 2 3])) "zipcoll")
|
||||||
|
|
||||||
# bc8be266f
|
# bc8be266f
|
||||||
|
@ -103,6 +103,7 @@
|
|||||||
(assert (deep= @"bcde" (buffer/blit @"" a -1 1 5)) "buffer/blit 3")
|
(assert (deep= @"bcde" (buffer/blit @"" a -1 1 5)) "buffer/blit 3")
|
||||||
(assert (deep= @"cde" (buffer/blit @"" a -1 2 5)) "buffer/blit 4")
|
(assert (deep= @"cde" (buffer/blit @"" a -1 2 5)) "buffer/blit 4")
|
||||||
(assert (deep= @"de" (buffer/blit @"" a -1 3 5)) "buffer/blit 5")
|
(assert (deep= @"de" (buffer/blit @"" a -1 3 5)) "buffer/blit 5")
|
||||||
|
(assert (deep= @"de" (buffer/blit @"" a nil 3 5)) "buffer/blit 6")
|
||||||
|
|
||||||
# buffer/push-at
|
# buffer/push-at
|
||||||
# c55d93512
|
# c55d93512
|
||||||
|
@ -159,5 +159,18 @@
|
|||||||
(assert-error "invalid offset-a: 1" (memcmp "a" "b" 1 1 0))
|
(assert-error "invalid offset-a: 1" (memcmp "a" "b" 1 1 0))
|
||||||
(assert-error "invalid offset-b: 1" (memcmp "a" "b" 1 0 1))
|
(assert-error "invalid offset-b: 1" (memcmp "a" "b" 1 0 1))
|
||||||
|
|
||||||
|
# Range
|
||||||
|
# a982f351d
|
||||||
|
(assert (deep= (range 10) @[0 1 2 3 4 5 6 7 8 9]) "(range 10)")
|
||||||
|
(assert (deep= (range 5 10) @[5 6 7 8 9]) "(range 5 10)")
|
||||||
|
(assert (deep= (range 0 16 4) @[0 4 8 12]) "(range 0 16 4)")
|
||||||
|
(assert (deep= (range 0 17 4) @[0 4 8 12 16]) "(range 0 17 4)")
|
||||||
|
(assert (deep= (range 16 0 -4) @[16 12 8 4]) "(range 16 0 -4)")
|
||||||
|
(assert (deep= (range 17 0 -4) @[17 13 9 5 1]) "(range 17 0 -4)")
|
||||||
|
|
||||||
|
(assert (= (length (range 10)) 10) "(range 10)")
|
||||||
|
(assert (= (length (range -10)) 0) "(range -10)")
|
||||||
|
(assert (= (length (range 1 10)) 9) "(range 1 10)")
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
|
||||||
|
@ -196,7 +196,8 @@
|
|||||||
(assert-error "division by zero" (op (int 7) (int 0)))))
|
(assert-error "division by zero" (op (int 7) (int 0)))))
|
||||||
|
|
||||||
(each int [int/s64 int/u64]
|
(each int [int/s64 int/u64]
|
||||||
(loop [x :in [-5 -3 0 3 5]]
|
(loop [x :in [-5 -3 0 3 5] :when (or (pos? x) (= int int/s64))]
|
||||||
|
# skip check when comparing negative values with unsigned integers.
|
||||||
(assert (= (int x) (mod (int x) 0)) (string int " mod 0"))
|
(assert (= (int x) (mod (int x) 0)) (string int " mod 0"))
|
||||||
(assert (= (int x) (mod x (int 0))) (string int " mod 0"))
|
(assert (= (int x) (mod x (int 0))) (string int " mod 0"))
|
||||||
(assert (= (int x) (mod (int x) (int 0))) (string int " mod 0"))))
|
(assert (= (int x) (mod (int x) (int 0))) (string int " mod 0"))))
|
||||||
@ -267,12 +268,12 @@
|
|||||||
# compare u64/i64
|
# compare u64/i64
|
||||||
(assert (= (compare (u64 1) (i64 2)) -1) "compare 7")
|
(assert (= (compare (u64 1) (i64 2)) -1) "compare 7")
|
||||||
(assert (= (compare (u64 1) (i64 -1)) +1) "compare 8")
|
(assert (= (compare (u64 1) (i64 -1)) +1) "compare 8")
|
||||||
(assert (= (compare (u64 -1) (i64 -1)) +1) "compare 9")
|
(assert (= (compare (u64 0) (i64 -1)) +1) "compare 9")
|
||||||
|
|
||||||
# compare i64/u64
|
# compare i64/u64
|
||||||
(assert (= (compare (i64 1) (u64 2)) -1) "compare 10")
|
(assert (= (compare (i64 1) (u64 2)) -1) "compare 10")
|
||||||
(assert (= (compare (i64 -1) (u64 1)) -1) "compare 11")
|
(assert (= (compare (i64 -1) (u64 1)) -1) "compare 11")
|
||||||
(assert (= (compare (i64 -1) (u64 -1)) -1) "compare 12")
|
(assert (= (compare (i64 -1) (u64 0)) -1) "compare 12")
|
||||||
|
|
||||||
# off by 1 error in inttypes
|
# off by 1 error in inttypes
|
||||||
# a3e812b86
|
# a3e812b86
|
||||||
@ -281,4 +282,7 @@
|
|||||||
(assert (= (int/s64 "0x7FFF_FFFF_FFFF_FFFF")
|
(assert (= (int/s64 "0x7FFF_FFFF_FFFF_FFFF")
|
||||||
(- (int/s64 "-0x8000_0000_0000_0000") 1)) "int types wrap around")
|
(- (int/s64 "-0x8000_0000_0000_0000") 1)) "int types wrap around")
|
||||||
|
|
||||||
|
# Issue #1217
|
||||||
|
(assert (= (- (int/u64 "0xFFFFFFFF") 1) (int/u64 "0xFFFFFFFE")) "u64 subtract")
|
||||||
|
|
||||||
(end-suite)
|
(end-suite)
|
||||||
|
@ -367,7 +367,7 @@
|
|||||||
(set "!$%&*+-./:<?=>@^_|"))
|
(set "!$%&*+-./:<?=>@^_|"))
|
||||||
:token (some :symchars)
|
:token (some :symchars)
|
||||||
:hex (range "09" "af" "AF")
|
:hex (range "09" "af" "AF")
|
||||||
:escape (* "\\" (+ (set "ntrvzf0e\"\\")
|
:escape (* "\\" (+ (set `"'0?\abefnrtvz`)
|
||||||
(* "x" :hex :hex)
|
(* "x" :hex :hex)
|
||||||
(error (constant "bad hex escape"))))
|
(error (constant "bad hex escape"))))
|
||||||
:comment (/ '(* "#" (any (if-not (+ "\n" -1) 1))) (constant :comment))
|
:comment (/ '(* "#" (any (if-not (+ "\n" -1) 1))) (constant :comment))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user