Skip to content

Commit 1ed892c

Browse files
authored
BenJilks: Quick fix (#337)
Co-authored-by: BenJilks <[email protected]>
1 parent ceed039 commit 1ed892c

File tree

3 files changed

+23
-7
lines changed

3 files changed

+23
-7
lines changed

BenJilks/src/interpreter.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ static Object *eval_list(Interpreter *interpreter, Scope *scope,
7878
int index = 0;
7979
Object *list_object = object_list(interpreter->heap, len);
8080
for (List *it = list; it; it = it->next)
81-
memcpy(&list_object->items[index++], eval_expression(interpreter, scope, it->value), sizeof(Object));
81+
object_copy(&list_object->items[index++], eval_expression(interpreter, scope, it->value));
8282

8383
return list_object;
8484
}

BenJilks/src/object.c

+21-6
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,21 @@ Object *object_list(Heap *heap, int len)
6565
return obj;
6666
}
6767

68+
void object_copy(Object *dst, Object *src)
69+
{
70+
memcpy(dst, src, sizeof(Object));
71+
switch (src->type)
72+
{
73+
case OBJECT_TYPE_STRING:
74+
dst->str = malloc(strlen(src->str) + 1);
75+
strcpy(dst->str, src->str);
76+
break;
77+
78+
defualt:
79+
break;
80+
}
81+
}
82+
6883
void object_free(Object *object)
6984
{
7085
switch (object->type)
@@ -130,9 +145,9 @@ Object *object_add(Heap *heap, Object *lhs, Object *rhs)
130145
case OBJECT_TYPE_LIST:
131146
{
132147
Object *list = object_list(heap, 1 + rhs->list_len);
133-
memcpy(&list->items[0], lhs, sizeof(Object));
148+
object_copy(&list->items[0], lhs);
134149
for (int i = 0; i < rhs->list_len; i++)
135-
list->items[i + 1] = rhs->items[i];
150+
object_copy(&list->items[i + 1], &rhs->items[i]);
136151
return list;
137152
}
138153

@@ -155,18 +170,18 @@ Object *object_add(Heap *heap, Object *lhs, Object *rhs)
155170
{
156171
Object *list = object_list(heap, 1 + lhs->list_len);
157172
for (int i = 0; i < lhs->list_len; i++)
158-
list->items[i] = lhs->items[i];
159-
memcpy(&list->items[lhs->list_len], rhs, sizeof(Object));
173+
object_copy(&list->items[i], &lhs->items[i]);
174+
object_copy(&list->items[lhs->list_len], rhs);
160175
return list;
161176
}
162177

163178
case OBJECT_TYPE_LIST:
164179
{
165180
Object *list = object_list(heap, lhs->list_len + rhs->list_len);
166181
for (int i = 0; i < lhs->list_len; i++)
167-
list->items[i] = lhs->items[i];
182+
object_copy(&list->items[i], &lhs->items[i]);
168183
for (int i = 0; i < rhs->list_len; i++)
169-
list->items[i + lhs->list_len] = rhs->items[i];
184+
object_copy(&list->items[i + lhs->list_len], &rhs->items[i]);
170185
return list;
171186
}
172187

BenJilks/src/object.h

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ Object *object_bool(Heap*, int);
4747
Object *object_function(Heap*, Function*);
4848
Object *object_native_function(Heap*, NativeFunction);
4949
Object *object_list(Heap*, int len);
50+
void object_copy(Object *dst, Object *src);
5051
void object_free(Object *object);
5152

5253
const char* object_to_string(Object*);

0 commit comments

Comments
 (0)