Skip to content

Commit 66f7326

Browse files
committed
- Restore refcount change
1 parent 5c243ed commit 66f7326

File tree

5 files changed

+69
-10
lines changed

5 files changed

+69
-10
lines changed

benchmark/run.clv

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,31 +33,31 @@ var i = 0;
3333
env.groups.each(function(g) {
3434
print(++i + ') ');
3535
println(g.info);
36-
36+
3737
print('running tests ');
3838
flush();
3939
var results = g.runTests(function (test) {
4040
print('.');
4141
flush();
4242
});
4343
println('');
44-
44+
4545
// Sorting Results by total execution time
4646
/*var set = Set.new(function (a, b) { return a.tt < b.tt; });
4747
for (var i = 0; i < rs.size(); i++) { set.insert(rs[i]); }
4848

4949
for (i = 0; i < set.size(); i++) {
5050
var r = set.find(i);
51-
51+
5252
//println("-- "+ r.test.lang.name + ": " + r.tt);
5353
println(r);
5454
}
5555
*/
56-
56+
5757
for (var i = 0; i < results.size(); i++) {
5858
println("-- "+ results[i].test.lang.name + ": " + results[i].tt);
5959
}
60-
60+
6161
/*
6262
g.tests.each(function(t) {
6363
println('-- '+ t.lang.name + ': ');

core/vm.cc

+9-2
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ CLEVER_FORCE_INLINE void VM::paramBinding(const Function* func,
196196

197197
if ((args_count - nargs) > 0) {
198198
for (size_t i = nargs; i < args_count; ++i) {
199-
arr->getData().push_back(args[i]->clone());
199+
arr->push_value(args[i]);
200200
}
201201
}
202202

@@ -212,7 +212,14 @@ CLEVER_FORCE_INLINE void VM::prepareCall(const Function* func, Environment* env)
212212
Environment* fenv = func->getEnvironment()->activate(env);
213213

214214
fenv->setRetAddr(m_pc + 1);
215-
fenv->setRetVal(getValue(OPCODE.result));
215+
216+
Value* retval = getValue(OPCODE.result);
217+
218+
if (retval->refCount() > 1) {
219+
retval = retval->clone();
220+
setValue(OPCODE.result, retval, true);
221+
}
222+
fenv->setRetVal(retval);
216223

217224
m_call_stack.push(CallStackEntry(fenv, func, &OPCODE.loc));
218225

modules/std/core/array.cc

+2-3
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,10 @@ CLEVER_METHOD(ArrayType::append)
8484
}
8585

8686
if (!args.empty()) {
87-
ValueVector& vec = clever_get_this(ArrayObject*)->getData();
87+
ArrayObject* arrobj = clever_get_this(ArrayObject*);
8888

8989
for (size_t i = 0, j = args.size(); i < j; ++i) {
90-
vec.push_back(args[i]->clone());
91-
vec.back()->setConst(false);
90+
arrobj->push_value(args[i]);
9291
}
9392
}
9493
result->setNull();

modules/std/core/array.h

+5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ class ArrayObject : public TypeObject {
3737
}
3838
}
3939

40+
void push_value(Value* value) {
41+
m_data.push_back(value);
42+
clever_addref(value);
43+
}
44+
4045
std::vector<Value*>& getData() { return m_data; }
4146
private:
4247
std::vector<Value*> m_data;

tests/lang/class_005.test

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Testing array on class member
2+
==CODE==
3+
import std.io.*;
4+
5+
class Bar {
6+
var name;
7+
8+
function Bar(s) {
9+
this.name = s;
10+
}
11+
12+
function run() {
13+
return this.name;
14+
}
15+
}
16+
17+
class Foo {
18+
var arr;
19+
20+
function Foo() {
21+
this.arr = [];
22+
}
23+
24+
function append(s) {
25+
this.arr.append(Bar.new(s));
26+
}
27+
28+
function getItems() {
29+
var items = [];
30+
31+
for (var i = 0; i < this.arr.size(); ++i) {
32+
items.append(this.arr[i].run());
33+
}
34+
35+
return items;
36+
}
37+
}
38+
39+
var f = Foo.new;
40+
41+
f.append('felipe');
42+
f.append('pericles');
43+
44+
var results = f.getItems();
45+
46+
println(results);
47+
==RESULT==
48+
\[felipe, pericles\]

0 commit comments

Comments
 (0)