Skip to content

Commit

Permalink
✨ feat: Add divide, multiply, subtract
Browse files Browse the repository at this point in the history
  • Loading branch information
caoccao committed Oct 27, 2024
1 parent 4fa7cd8 commit d3ec183
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 2 deletions.
16 changes: 16 additions & 0 deletions scripts/ts/test/test.four.basic.operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,26 @@ class Test {
public add_II_I(a: int, b: int): int {
return a + b;
}

public add_IL_L(a: int, b: long): long {
return a + b;
}

public divide_II_I(a: int, b: int): int {
return a / b;
}

public multiply_II_I(a: int, b: int): int {
return a * b;
}

public subtract_II_I(a: int, b: int): int {
return a - b;
}
}

console.log(new Test().add_II_I(1, 2));
console.log(new Test().add_IL_L(1, 2));
console.log(new Test().divide_II_I(3, 2));
console.log(new Test().multiply_II_I(3, 2));
console.log(new Test().subtract_II_I(3, 2));
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,15 @@ public void manipulate(JavaFunctionContext functionContext, Swc4jAstBinExpr ast)
case Add:
stackManipulation = JavaClassCast.getAddition(upCastClass);
break;
case Div:
stackManipulation = JavaClassCast.getDivision(upCastClass);
break;
case Mul:
stackManipulation = JavaClassCast.getMultiplication(upCastClass);
break;
case Sub:
stackManipulation = JavaClassCast.getSubtraction(upCastClass);
break;
default:
throw new Ts2JavaAstException(
ast,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@
import com.caoccao.javet.utils.SimpleFreeMarkerFormat;
import com.caoccao.javet.utils.SimpleMap;
import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.implementation.bytecode.Addition;
import net.bytebuddy.implementation.bytecode.StackManipulation;
import net.bytebuddy.implementation.bytecode.*;
import net.bytebuddy.implementation.bytecode.assign.primitive.PrimitiveWideningDelegate;

import java.util.Optional;
Expand All @@ -41,6 +40,39 @@ public static Addition getAddition(Class<?> clazz) {
return Addition.INTEGER;
}

public static Division getDivision(Class<?> clazz) {
if (clazz == long.class) {
return Division.LONG;
} else if (clazz == float.class) {
return Division.FLOAT;
} else if (clazz == double.class) {
return Division.DOUBLE;
}
return Division.INTEGER;
}

public static Multiplication getMultiplication(Class<?> clazz) {
if (clazz == long.class) {
return Multiplication.LONG;
} else if (clazz == float.class) {
return Multiplication.FLOAT;
} else if (clazz == double.class) {
return Multiplication.DOUBLE;
}
return Multiplication.INTEGER;
}

public static Subtraction getSubtraction(Class<?> clazz) {
if (clazz == long.class) {
return Subtraction.LONG;
} else if (clazz == float.class) {
return Subtraction.FLOAT;
} else if (clazz == double.class) {
return Subtraction.DOUBLE;
}
return Subtraction.INTEGER;
}

public static Class<?> getUpCastClassForMathOp(Class<?>... classes) {
final int length = classes.length;
if (length <= 1) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,40 @@ public void testAdd_IL_L() throws Exception {
Object object = clazz.getConstructor().newInstance();
assertEquals(3L, method.invoke(object, 1, 2L));
}

@Test
public void testDivide_II_I() throws Exception {
Method method = clazz.getMethod("divide_II_I", int.class, int.class);
assertNotNull(method);
assertEquals(int.class, method.getReturnType());
assertEquals(2, method.getParameterCount());
assertEquals(int.class, method.getParameters()[0].getType());
assertEquals(int.class, method.getParameters()[1].getType());
Object object = clazz.getConstructor().newInstance();
assertEquals(1, method.invoke(object, 3, 2));
}

@Test
public void testMultiply_II_I() throws Exception {
Method method = clazz.getMethod("multiply_II_I", int.class, int.class);
assertNotNull(method);
assertEquals(int.class, method.getReturnType());
assertEquals(2, method.getParameterCount());
assertEquals(int.class, method.getParameters()[0].getType());
assertEquals(int.class, method.getParameters()[1].getType());
Object object = clazz.getConstructor().newInstance();
assertEquals(6, method.invoke(object, 3, 2));
}

@Test
public void testSubtract_II_I() throws Exception {
Method method = clazz.getMethod("subtract_II_I", int.class, int.class);
assertNotNull(method);
assertEquals(int.class, method.getReturnType());
assertEquals(2, method.getParameterCount());
assertEquals(int.class, method.getParameters()[0].getType());
assertEquals(int.class, method.getParameters()[1].getType());
Object object = clazz.getConstructor().newInstance();
assertEquals(1, method.invoke(object, 3, 2));
}
}

0 comments on commit d3ec183

Please sign in to comment.