mirror of
https://github.com/ProgramSnail/Lama.git
synced 2025-12-06 06:48:48 +00:00
Shallow clone (runtime function)
This commit is contained in:
parent
a453b65fd3
commit
46dfd58bda
6 changed files with 31 additions and 7 deletions
5
regression/x86only/orig/test007.log
Normal file
5
regression/x86only/orig/test007.log
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
Cloning int: 5
|
||||||
|
Cloning string: abc
|
||||||
|
Cloning array: [1, 2, 3, 4, 5]
|
||||||
|
Cloning sexp: A (1, 2, 3, 4, 5)
|
||||||
|
Cloning closure: address ok, 5, 6
|
||||||
14
regression/x86only/test007.expr
Normal file
14
regression/x86only/test007.expr
Normal file
|
|
@ -0,0 +1,14 @@
|
||||||
|
fun f (x, y) {
|
||||||
|
fun () {x+y}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf ("Cloning int: %d\n", clone (5));
|
||||||
|
printf ("Cloning string: %s\n", clone ("abc"));
|
||||||
|
printf ("Cloning array: %s\n", clone ([1, 2, 3, 4, 5]).string);
|
||||||
|
printf ("Cloning sexp: %s\n", clone (A (1, 2, 3, 4, 5)).string);
|
||||||
|
|
||||||
|
{
|
||||||
|
local c = f (5, 6), cc = clone (c);
|
||||||
|
|
||||||
|
printf ("Cloning closure: address %s, %d, %d\n", if cc[0] == c[0] then "ok" else "fail" fi, c[1], c[2])
|
||||||
|
}
|
||||||
|
|
@ -485,7 +485,7 @@ void *Lclone (void *p) {
|
||||||
|
|
||||||
if (UNBOXED(p)) return p;
|
if (UNBOXED(p)) return p;
|
||||||
else {
|
else {
|
||||||
data *a = TO_DATA(p), *res;
|
data *a = TO_DATA(p);
|
||||||
int t = TAG(a->tag), l = LEN(a->tag);
|
int t = TAG(a->tag), l = LEN(a->tag);
|
||||||
|
|
||||||
switch (t) {
|
switch (t) {
|
||||||
|
|
@ -496,12 +496,15 @@ void *Lclone (void *p) {
|
||||||
case ARRAY_TAG:
|
case ARRAY_TAG:
|
||||||
case CLOSURE_TAG:
|
case CLOSURE_TAG:
|
||||||
res = (data*) alloc (sizeof(int) * (l+1));
|
res = (data*) alloc (sizeof(int) * (l+1));
|
||||||
strncpy (res, p, sizeof(int) * (l+1));
|
memcpy (res, a, sizeof(int) * (l+1));
|
||||||
|
res = res->contents;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SEXP_TAG:
|
case SEXP_TAG:
|
||||||
res = (data*) alloc (sizeof(int) * (l+2));
|
res = (sexp*) alloc (sizeof(int) * (l+2));
|
||||||
strncpy (res, TO_SEXP(p), sizeof(int) * (l+2));
|
memcpy (res, TO_SEXP(p), sizeof(int) * (l+2));
|
||||||
|
res = res->contents;
|
||||||
|
res = res->contents;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
@ -1142,7 +1145,7 @@ extern void __gc_root_scan_stack ();
|
||||||
/* Mark-and-copy */
|
/* Mark-and-copy */
|
||||||
/* ======================================== */
|
/* ======================================== */
|
||||||
|
|
||||||
static size_t SPACE_SIZE = 32;
|
static size_t SPACE_SIZE = 32 * 1024;
|
||||||
// static size_t SPACE_SIZE = 128;
|
// static size_t SPACE_SIZE = 128;
|
||||||
// static size_t SPACE_SIZE = 1024 * 1024;
|
// static size_t SPACE_SIZE = 1024 * 1024;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,7 @@ let compile cmd env code =
|
||||||
match scode with
|
match scode with
|
||||||
| [] -> env, []
|
| [] -> env, []
|
||||||
| instr :: scode' ->
|
| instr :: scode' ->
|
||||||
let stack = env#show_stack in
|
let stack = "" (* env#show_stack*) in
|
||||||
let env', code' =
|
let env', code' =
|
||||||
match instr with
|
match instr with
|
||||||
| PUBLIC name -> env#register_public name, []
|
| PUBLIC name -> env#register_public name, []
|
||||||
|
|
|
||||||
|
|
@ -255,5 +255,5 @@ public fun emptyMemo () {
|
||||||
}
|
}
|
||||||
|
|
||||||
public fun lookupMemo (m, v) {
|
public fun lookupMemo (m, v) {
|
||||||
|
skip
|
||||||
}
|
}
|
||||||
|
|
@ -6,6 +6,8 @@ RC=../src/rc.opt
|
||||||
|
|
||||||
all: $(ALL)
|
all: $(ALL)
|
||||||
|
|
||||||
|
Collection.o: List.o
|
||||||
|
|
||||||
%.o: %.expr
|
%.o: %.expr
|
||||||
$(RC) -I . -c $<
|
$(RC) -I . -c $<
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue