1
0
mirror of https://github.com/janet-lang/janet synced 2025-10-24 20:27:41 +00:00

Fix small compiler bug

This commit is contained in:
Calvin Rose
2018-02-03 17:22:04 -05:00
parent 35ddc70888
commit a673b7e326
9 changed files with 169 additions and 27 deletions

View File

@@ -64,7 +64,7 @@
ret)
(defmacro for [head & body]
(def head (ast-unwrap head))
(def head (ast-unwrap1 head))
(def sym (get head 0))
(def start (get head 1))
(def end (get head 2))
@@ -76,3 +76,50 @@
(tuple-prepend body 'do)
(tuple 'varset! sym (tuple '+ sym 1))
)))
(defn pp-seq [pp buf a indent start end]
(def len (length a))
(buffer-push-string buf start)
(for [i 0 len]
(when (not= i 0) (buffer-push-string buf " "))
(pp buf (get a i) indent))
(buffer-push-string buf end)
buf)
(defn push-line [buf indent]
(buffer-push-string buf "\n")
(for [i 0 indent] (buffer-push-string buf " "))
)
(defn pp-dict [pp buf a indent start end]
(var k (next a nil))
(buffer-push-string buf start)
(def newindent (+ 2 indent))
(push-line buf newindent)
(while k
(def v (get a k))
(pp buf k)
(buffer-push-string buf " ")
(pp buf v)
(varset! k (next a k))
(push-line buf (if k newindent indent))
)
(buffer-push-string buf end)
buf)
(def _printers {
:array (fn [pp buf x i] (pp-seq pp buf x i "[" "]"))
:tuple (fn [pp buf x i] (pp-seq pp buf x i "(" ")"))
:table (fn [pp buf x i] (pp-dict pp buf x i "@{" "}"))
:struct (fn [pp buf x i] (pp-dict pp buf x i "{" "}"))
})
(defn _default_printer [_ buf x] (buffer-push-string buf (string x)) buf)
(defn pp1 [buf x indent]
(def pmaybe (get _printers (type x)))
(def p (if pmaybe pmaybe _default_printer))
(p pp1 buf x indent))
(defn pp [x] (print (pp1 (buffer) x 0)))

View File

@@ -123,8 +123,8 @@ static DstSlot namelocal(DstCompiler *c, DstAst *ast, Dst head, int32_t flags, D
dstc_copy(c, ast, localslot, ret);
ret = localslot;
}
ret.flags |= flags;
dstc_nameslot(c, dst_unwrap_symbol(head), ret);
ret.flags |= DST_SLOT_NAMED;
return ret;
}

View File

@@ -218,7 +218,7 @@ int dst_core_gccollect(DstArgs args) {
int dst_core_type(DstArgs args) {
if (args.n != 1) return dst_throw(args, "expected 1 argument");
if (dst_checktype(args.v[0], DST_ABSTRACT)) {
return dst_return(args, dst_cstringv(dst_abstract_type(dst_unwrap_abstract(args.v[0]))->name));
return dst_return(args, dst_csymbolv(dst_abstract_type(dst_unwrap_abstract(args.v[0]))->name));
} else {
return dst_return(args, dst_csymbolv(dst_type_names[dst_type(args.v[0])]));
}

View File

@@ -40,7 +40,7 @@ struct IOFile {
static int dst_io_gc(void *p, size_t len);
DstAbstractType dst_io_filetype = {
"core.file",
":core.file",
dst_io_gc,
NULL
};

View File

@@ -254,26 +254,6 @@ int32_t dst_length(Dst x) {
}
}
/* Get the capacity of an object. Returns 0 for invalid types */
int32_t dst_capacity(Dst x) {
switch (dst_type(x)) {
default:
return 0;
case DST_STRING:
return dst_string_length(dst_unwrap_string(x));
case DST_ARRAY:
return dst_unwrap_array(x)->capacity;
case DST_BUFFER:
return dst_unwrap_buffer(x)->capacity;
case DST_TUPLE:
return dst_tuple_length(dst_unwrap_tuple(x));
case DST_STRUCT:
return dst_struct_length(dst_unwrap_struct(x));
case DST_TABLE:
return dst_unwrap_table(x)->capacity;
}
}
/* Index into a data structure. Returns nil for out of bounds or invlalid data structure */
Dst dst_getindex(Dst ds, int32_t index) {
switch (dst_type(ds)) {

View File

@@ -184,7 +184,6 @@ Dst dst_get(Dst ds, Dst key);
void dst_put(Dst ds, Dst key, Dst value);
const DstKV *dst_next(Dst ds, const DstKV *kv);
int32_t dst_length(Dst x);
int32_t dst_capacity(Dst x);
Dst dst_getindex(Dst ds, int32_t index);
void dst_setindex(Dst ds, Dst value, int32_t index);
int dst_cstrcmp(const uint8_t *str, const char *other);

View File

@@ -32,7 +32,7 @@ static int dst_ast_gcmark(void *p, size_t size) {
/* AST type */
static DstAbstractType dst_ast_type = {
"parse.ast",
":parse.ast",
NULL,
dst_ast_gcmark
};

View File

@@ -533,7 +533,7 @@ static int parsergc(void *p, size_t size) {
}
DstAbstractType dst_parse_parsertype = {
"parse.parser",
":parse.parser",
parsergc,
parsermark
};