Skip to content

Commit 3b31773

Browse files
authored
Merge pull request #42 from kornilova-l/renamve-varArgs-parameter
Generate new name if varArgs parameter already exist
2 parents a2b6cb5 + bcf666d commit 3b31773

File tree

4 files changed

+26
-3
lines changed

4 files changed

+26
-3
lines changed

ir/Function.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ llvm::raw_ostream &operator<<(llvm::raw_ostream &s, const Function &func) {
2323
}
2424
if (func.isVariadic) {
2525
/* the C Iso require at least one argument in a variadic function, so the comma is fine */
26-
s << ", varArgs: native.CVararg*";
26+
s << ", " << func.getVarargsParameterName() << ": native.CVararg*";
2727
}
2828
s << "): "
2929
<< func.retType
@@ -46,3 +46,21 @@ bool Function::usesType(const std::string &type) const {
4646
std::string Function::getName() const {
4747
return name;
4848
}
49+
50+
std::string Function::getVarargsParameterName() const {
51+
std::string parameterName = "varArgs";
52+
int i = 0;
53+
while (existParameterWithName(parameterName)) {
54+
parameterName = "varArgs" + std::to_string(i++);
55+
}
56+
return parameterName;
57+
}
58+
59+
bool Function::existParameterWithName(const std::string &parameterName) const {
60+
for (const auto &parameter : parameters) {
61+
if (parameter.getName() == parameterName) {
62+
return true;
63+
}
64+
}
65+
return false;
66+
}

ir/Function.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class Function {
2424
std::string getName() const;
2525

2626
private:
27+
28+
std::string getVarargsParameterName() const;
29+
30+
bool existParameterWithName(const std::string &parameterName) const;
31+
2732
std::string name;
2833
std::vector<Parameter> parameters;
2934
std::string retType;

tests/samples/Function.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ int void_arg(void);
33
void one_arg(int a);
44
void *two_args(float a, int b);
55
void anonymous_args(float, int);
6-
double variadic_args(double a, void* b, ...);
6+
double variadic_args(double a, void* varArgs, ...);

tests/samples/Function.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ object Function {
1010
def one_arg(a: native.CInt): Unit = native.extern
1111
def two_args(a: native.CFloat, b: native.CInt): native.Ptr[Byte] = native.extern
1212
def anonymous_args(anonymous0: native.CFloat, anonymous1: native.CInt): Unit = native.extern
13-
def variadic_args(a: native.CDouble, b: native.Ptr[Byte], varArgs: native.CVararg*): native.CDouble = native.extern
13+
def variadic_args(a: native.CDouble, varArgs: native.Ptr[Byte], varArgs0: native.CVararg*): native.CDouble = native.extern
1414
}

0 commit comments

Comments
 (0)