From 7cf62acc80a7ae6660f380e5bb37141ed3277fb1 Mon Sep 17 00:00:00 2001 From: otya128 Date: Mon, 19 Dec 2016 23:15:29 +0900 Subject: [PATCH] Fix COPY adding elements --- SMILEBASIC/builtinfunctions.d | 12 ++++++++++++ SMILEBASIC/type.d | 36 +++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index f86dcf5..1e8dc55 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -1994,6 +1994,18 @@ class BuiltinFunction throw new TypeMismatch("COPY", sourceArrayIndex + 2); len = args[sourceArrayIndex + 1].castInteger; } + else + { + len = src.length - srcoffset; + } + if (dst.length < len + dstoffset) + { + if (dst.dimCount != 1) + { + throw new SubscriptOutOfRange("COPY"); + } + dst.length = len + dstoffset; + } if (src.type == ValueType.StringArray && dst.type == ValueType.StringArray) { for(int i = 0; i < len; i++) diff --git a/SMILEBASIC/type.d b/SMILEBASIC/type.d index 5928b23..e41af29 100644 --- a/SMILEBASIC/type.d +++ b/SMILEBASIC/type.d @@ -226,6 +226,42 @@ struct Value throw new TypeMismatch(); } } + @property void length(int len) + { + switch(this.type) + { + case ValueType.String: + stringValue.length = len; + return; + case ValueType.IntegerArray: + integerArray.length = len; + return; + case ValueType.DoubleArray: + doubleArray.length = len; + return; + case ValueType.StringArray: + stringArray.length = len; + return; + default: + throw new TypeMismatch(); + } + } + @property int dimCount() + { + switch(this.type) + { + case ValueType.String: + return stringValue.dimCount; + case ValueType.IntegerArray: + return integerArray.dimCount; + case ValueType.DoubleArray: + return doubleArray.dimCount; + case ValueType.StringArray: + return stringArray.dimCount; + default: + throw new TypeMismatch(); + } + } void opIndexAssign(Value v, int i) { switch(this.type)