mirror of
https://github.com/janet-lang/janet
synced 2025-01-11 08:00:27 +00:00
Fix funcdef flags when marshaling.
This commit is contained in:
parent
600292fad4
commit
634ec85b07
@ -100,12 +100,12 @@ static const DstInstructionDef dst_ops[] = {
|
|||||||
{"ldu", DOP_LOAD_UPVALUE},
|
{"ldu", DOP_LOAD_UPVALUE},
|
||||||
{"len", DOP_LENGTH},
|
{"len", DOP_LENGTH},
|
||||||
{"lt", DOP_LESS_THAN},
|
{"lt", DOP_LESS_THAN},
|
||||||
|
{"lten", DOP_NUMERIC_LESS_THAN_EQUAL},
|
||||||
|
{"lter", DOP_LESS_THAN_EQUAL_REAL},
|
||||||
{"lti", DOP_LESS_THAN_INTEGER},
|
{"lti", DOP_LESS_THAN_INTEGER},
|
||||||
{"ltim", DOP_LESS_THAN_IMMEDIATE},
|
{"ltim", DOP_LESS_THAN_IMMEDIATE},
|
||||||
{"ltn", DOP_NUMERIC_LESS_THAN},
|
{"ltn", DOP_NUMERIC_LESS_THAN},
|
||||||
{"ltr", DOP_LESS_THAN_REAL},
|
{"ltr", DOP_LESS_THAN_REAL},
|
||||||
{"lten", DOP_NUMERIC_LESS_THAN_EQUAL},
|
|
||||||
{"lter", DOP_LESS_THAN_EQUAL_REAL},
|
|
||||||
{"mkarr", DOP_MAKE_ARRAY},
|
{"mkarr", DOP_MAKE_ARRAY},
|
||||||
{"mkbuf", DOP_MAKE_BUFFER},
|
{"mkbuf", DOP_MAKE_BUFFER},
|
||||||
{"mkstr", DOP_MAKE_STRING},
|
{"mkstr", DOP_MAKE_STRING},
|
||||||
@ -716,9 +716,6 @@ static DstAssembleResult dst_asm1(DstAssembler *parent, Dst source, int flags) {
|
|||||||
def->environments =
|
def->environments =
|
||||||
realloc(def->environments, def->environments_length * sizeof(int32_t));
|
realloc(def->environments, def->environments_length * sizeof(int32_t));
|
||||||
|
|
||||||
/* Add extra flags */
|
|
||||||
dst_func_addflags(def);
|
|
||||||
|
|
||||||
/* Verify the func def */
|
/* Verify the func def */
|
||||||
if (dst_verify(def)) {
|
if (dst_verify(def)) {
|
||||||
dst_asm_error(&a, "invalid assembly");
|
dst_asm_error(&a, "invalid assembly");
|
||||||
|
@ -112,7 +112,7 @@ enum DstInstructionType dst_instructions[DOP_INSTRUCTION_COUNT] = {
|
|||||||
|
|
||||||
/* Verify some bytecode */
|
/* Verify some bytecode */
|
||||||
int32_t dst_verify(DstFuncDef *def) {
|
int32_t dst_verify(DstFuncDef *def) {
|
||||||
int vargs = def->flags & DST_FUNCDEF_FLAG_VARARG;
|
int vargs = !!(def->flags & DST_FUNCDEF_FLAG_VARARG);
|
||||||
int32_t i;
|
int32_t i;
|
||||||
int32_t maxslot = def->arity + vargs;
|
int32_t maxslot = def->arity + vargs;
|
||||||
int32_t sc = def->slotcount;
|
int32_t sc = def->slotcount;
|
||||||
|
@ -24,7 +24,6 @@
|
|||||||
#include "compile.h"
|
#include "compile.h"
|
||||||
#include "emit.h"
|
#include "emit.h"
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
#include "util.h"
|
|
||||||
|
|
||||||
DstFopts dstc_fopts_default(DstCompiler *c) {
|
DstFopts dstc_fopts_default(DstCompiler *c) {
|
||||||
DstFopts ret;
|
DstFopts ret;
|
||||||
@ -614,9 +613,6 @@ DstFuncDef *dstc_pop_funcdef(DstCompiler *c) {
|
|||||||
def->flags |= DST_FUNCDEF_FLAG_NEEDSENV;
|
def->flags |= DST_FUNCDEF_FLAG_NEEDSENV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add extra flags */
|
|
||||||
dst_func_addflags(def);
|
|
||||||
|
|
||||||
/* Pop the scope */
|
/* Pop the scope */
|
||||||
dstc_popscope(c);
|
dstc_popscope(c);
|
||||||
|
|
||||||
|
@ -341,7 +341,6 @@ static void dst_quick_asm(
|
|||||||
DST_OUT_OF_MEMORY;
|
DST_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
memcpy(def->bytecode, bytecode, bytecode_size);
|
memcpy(def->bytecode, bytecode, bytecode_size);
|
||||||
dst_func_addflags(def);
|
|
||||||
dst_env_def(env, name, dst_wrap_function(dst_thunk(def)));
|
dst_env_def(env, name, dst_wrap_function(dst_thunk(def)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,6 +124,15 @@ static void marshal_one_env(MarshalState *st, DstFuncEnv *env, int flags) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Add function flags to dst functions */
|
||||||
|
static void dst_func_addflags(DstFuncDef *def) {
|
||||||
|
if (def->name) def->flags |= DST_FUNCDEF_FLAG_HASNAME;
|
||||||
|
if (def->source) def->flags |= DST_FUNCDEF_FLAG_HASSOURCE;
|
||||||
|
if (def->defs) def->flags |= DST_FUNCDEF_FLAG_HASDEFS;
|
||||||
|
if (def->environments) def->flags |= DST_FUNCDEF_FLAG_HASENVS;
|
||||||
|
if (def->sourcemap) def->flags |= DST_FUNCDEF_FLAG_HASSOURCEMAP;
|
||||||
|
}
|
||||||
|
|
||||||
/* Marshal a function def */
|
/* Marshal a function def */
|
||||||
static void marshal_one_def(MarshalState *st, DstFuncDef *def, int flags) {
|
static void marshal_one_def(MarshalState *st, DstFuncDef *def, int flags) {
|
||||||
for (int32_t i = 0; i < dst_v_count(st->seen_defs); i++) {
|
for (int32_t i = 0; i < dst_v_count(st->seen_defs); i++) {
|
||||||
@ -133,6 +142,7 @@ static void marshal_one_def(MarshalState *st, DstFuncDef *def, int flags) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
dst_func_addflags(def);
|
||||||
/* Add to lookup */
|
/* Add to lookup */
|
||||||
dst_v_push(st->seen_defs, def);
|
dst_v_push(st->seen_defs, def);
|
||||||
pushint(st, def->flags);
|
pushint(st, def->flags);
|
||||||
@ -821,8 +831,8 @@ static int cfun_unmarshal(DstArgs args) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static const DstReg cfuns[] = {
|
static const DstReg cfuns[] = {
|
||||||
{"marsh.marshal", cfun_marshal},
|
{"marshal", cfun_marshal},
|
||||||
{"marsh.unmarshal", cfun_unmarshal},
|
{"unmarshal", cfun_unmarshal},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,15 +95,6 @@ int32_t dst_tablen(int32_t n) {
|
|||||||
return n + 1;
|
return n + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add function flags to dst functions */
|
|
||||||
void dst_func_addflags(DstFuncDef *def) {
|
|
||||||
if (def->name) def->flags |= DST_FUNCDEF_FLAG_HASNAME;
|
|
||||||
if (def->source) def->flags |= DST_FUNCDEF_FLAG_HASSOURCE;
|
|
||||||
if (def->defs) def->flags |= DST_FUNCDEF_FLAG_HASDEFS;
|
|
||||||
if (def->environments) def->flags |= DST_FUNCDEF_FLAG_HASENVS;
|
|
||||||
if (def->sourcemap) def->flags |= DST_FUNCDEF_FLAG_HASSOURCEMAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compare a dst string with a cstring. more efficient than loading
|
/* Compare a dst string with a cstring. more efficient than loading
|
||||||
* c string as a dst string. */
|
* c string as a dst string. */
|
||||||
int dst_cstrcmp(const uint8_t *str, const char *other) {
|
int dst_cstrcmp(const uint8_t *str, const char *other) {
|
||||||
|
@ -31,7 +31,6 @@ int32_t dst_array_calchash(const Dst *array, int32_t len);
|
|||||||
int32_t dst_kv_calchash(const DstKV *kvs, int32_t len);
|
int32_t dst_kv_calchash(const DstKV *kvs, int32_t len);
|
||||||
int32_t dst_string_calchash(const uint8_t *str, int32_t len);
|
int32_t dst_string_calchash(const uint8_t *str, int32_t len);
|
||||||
int32_t dst_tablen(int32_t n);
|
int32_t dst_tablen(int32_t n);
|
||||||
void dst_func_addflags(DstFuncDef *def);
|
|
||||||
void dst_buffer_push_types(DstBuffer *buffer, int types);
|
void dst_buffer_push_types(DstBuffer *buffer, int types);
|
||||||
const void *dst_strbinsearch(
|
const void *dst_strbinsearch(
|
||||||
const void *tab,
|
const void *tab,
|
||||||
|
@ -142,8 +142,8 @@
|
|||||||
# Marshal
|
# Marshal
|
||||||
|
|
||||||
(defn testmarsh [x msg]
|
(defn testmarsh [x msg]
|
||||||
(def marshx (marsh.marshal x))
|
(def marshx (marshal x))
|
||||||
(def out (-> marshx marsh.unmarshal marsh.marshal))
|
(def out (-> marshx unmarshal marshal))
|
||||||
(assert (= (string marshx) (string out)) msg))
|
(assert (= (string marshx) (string out)) msg))
|
||||||
|
|
||||||
(testmarsh nil "marshal nil")
|
(testmarsh nil "marshal nil")
|
||||||
@ -164,6 +164,8 @@
|
|||||||
(testmarsh (fn name [x] x) "marshal function 1")
|
(testmarsh (fn name [x] x) "marshal function 1")
|
||||||
(testmarsh (fn [x] (+ 10 x 2)) "marshal function 2")
|
(testmarsh (fn [x] (+ 10 x 2)) "marshal function 2")
|
||||||
(testmarsh (fn thing [x] (+ 11 x x 30)) "marshal function 3")
|
(testmarsh (fn thing [x] (+ 11 x x 30)) "marshal function 3")
|
||||||
|
(testmarsh map "marshal function 4")
|
||||||
|
(testmarsh reduce "marshal function 4")
|
||||||
|
|
||||||
# Large functions
|
# Large functions
|
||||||
(def manydefs (for [i :range [0 300]] (tuple 'def (gensym) (string "value_" i))))
|
(def manydefs (for [i :range [0 300]] (tuple 'def (gensym) (string "value_" i))))
|
||||||
|
Loading…
Reference in New Issue
Block a user