From 9bd7ff7b881a6c051fd0eecc970502651d8995d8 Mon Sep 17 00:00:00 2001 From: Kray-G Date: Fri, 5 Mar 2021 20:27:08 +0900 Subject: [PATCH 1/3] fixed a spread when no arguments. --- src/extlib/kxarray.c | 8 +------- src/ir_util.c | 4 ++-- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/src/extlib/kxarray.c b/src/extlib/kxarray.c index 04d786633..a6a46fd3c 100644 --- a/src/extlib/kxarray.c +++ b/src/extlib/kxarray.c @@ -447,14 +447,8 @@ int Array_flatten(int args, kx_frm_t *frmv, kx_frm_t *lexv, kx_context_t *ctx) { kx_obj_t *obj = get_arg_obj(1, args, ctx); if (obj) { - int level = -1; kx_obj_t *ary = allocate_obj(ctx); - if (args > 1) { - kx_val_t val = kv_last_by(ctx->stack, 2); - if (val.type == KX_INT_T) { - level = get_arg_int(2, args, ctx); - } - } + int level = args > 1 ? get_arg_int(2, args, ctx) : -1; int r = Array_flatten_impl(args, ctx, ary, obj, 0, level); if (r > 0) { KX_ADJST_STACK(); diff --git a/src/ir_util.c b/src/ir_util.c index 800f40662..9be2e1112 100644 --- a/src/ir_util.c +++ b/src/ir_util.c @@ -6432,7 +6432,7 @@ void kx_try_spread(kx_context_t *ctx, kx_code_t *cur, kx_val_t *v1) kx_obj_t *obj = v1->value.ov; int len = kv_size(obj->ary); if (len == 0) { - push_undef((ctx)->stack); + ctx->spread_additional--; } else { ctx->spread_additional += --len; for (int i = len; i >= 0; --i) { @@ -6443,7 +6443,7 @@ void kx_try_spread(kx_context_t *ctx, kx_code_t *cur, kx_val_t *v1) kvec_t(uint8_t) *bin = &(v1->value.bn->bin); int len = kv_size(*bin); if (len == 0) { - push_undef((ctx)->stack); + ctx->spread_additional--; } else { ctx->spread_additional += --len; for (int i = len; i >= 0; --i) { From 9722c23814a17d9b4f2a00e260b6b4df3eb0b8cb Mon Sep 17 00:00:00 2001 From: Kray-G Date: Fri, 5 Mar 2021 20:34:33 +0900 Subject: [PATCH 2/3] removed an unnecessary char. --- src/ast_gencode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ast_gencode.c b/src/ast_gencode.c index c25222259..cc0b251ef 100644 --- a/src/ast_gencode.c +++ b/src/ast_gencode.c @@ -1150,7 +1150,7 @@ LOOP_HEAD:; KX_CANNOT_BE_LVALUE(node, "Key-vaule"); if (node->lhs->type == KXOP_SPREAD) { gencode_ast_hook(ctx, node->lhs->lhs, ana, 0); - kv_push(kx_code_t, get_block(module, ana->block)->code, ((kx_code_t){ FILELINE(ana), .op = KX_APPENDA }));\ + kv_push(kx_code_t, get_block(module, ana->block)->code, ((kx_code_t){ FILELINE(ana), .op = KX_APPENDA })); } else { gencode_ast_hook(ctx, node->lhs, ana, 0); kv_push(kx_code_t, get_block(module, ana->block)->code, ((kx_code_t){ FILELINE(ana), .op = KX_APPENDK, .value1 = { .s = const_str(ctx, node->value.s) } })); From 5d3189fae565458ae5701e7f4fe500150caf3d5f Mon Sep 17 00:00:00 2001 From: Kray-G Date: Fri, 5 Mar 2021 21:53:27 +0900 Subject: [PATCH 3/3] added a new Functional. --- lib/std/kxfunctional.kx | 25 ++++++++++++++++++++++++- lib/std/kxstartup.kx | 10 +++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/std/kxfunctional.kx b/lib/std/kxfunctional.kx index 444e9abd0..2fb896a12 100644 --- a/lib/std/kxfunctional.kx +++ b/lib/std/kxfunctional.kx @@ -114,4 +114,27 @@ _function _functional_enumerator(e) { }; } -Functional.enumerable = Functional.Enumerator.create = _functional_enumerator; +Functional.methodMissing = _function(_instance, method, ...a) { + Functional[method] = _function(...args) { + return _function(obj) { + return obj[method](...args); + }; + }; + return Functional[method](...a); +}; + +// The methods in Array such as `map` have to be assigned to this object +// because Array.map will have been called directly instead of this.map +// and methodMissing will not be called. +Array.keySet(Array).filter({ => Array[_1].isFunction }).each { &(method) + Functional[method] = _function(...args) { + return _function(obj) { + return obj[method](...args); + }; + }; +}; + +Functional.enumerable + = Functional.Enumerator.create + = _functional_enumerator + ; diff --git a/lib/std/kxstartup.kx b/lib/std/kxstartup.kx index 85a612fed..d727a25c0 100644 --- a/lib/std/kxstartup.kx +++ b/lib/std/kxstartup.kx @@ -22,6 +22,11 @@ var Xml, Net; Net = _import('kxnet'); SQLite = _import('kxsqlite'); Debugger = _import('kxdebugger'); + using kxsysutil; + using kxstring; + using kxarray; + using kxbinary; + using kxnumeric; using kxisolate; using kxexception; using kxsqlite; @@ -29,11 +34,6 @@ var Xml, Net; using kxnet; using kxenumerable; using kxfunctional; - using kxsysutil; - using kxstring; - using kxarray; - using kxbinary; - using kxnumeric; using kxfile; using kxgetopt; Zip.create = File._zipCreate;