Skip to content

Commit

Permalink
Merge branch 'master' of github.com:trifork/erjang
Browse files Browse the repository at this point in the history
  • Loading branch information
krestenkrab committed May 17, 2011
2 parents 17d0e5b + 1d3ba2c commit d10d144
Showing 1 changed file with 8 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/main/java/erjang/beam/CompilerVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@
import erjang.EDouble;
import erjang.EFun;
import erjang.EInteger;
import erjang.EBig;
import erjang.EInternalPID;
import erjang.EList;
import erjang.EModuleManager;
Expand Down Expand Up @@ -141,6 +142,7 @@ public class CompilerVisitor implements ModuleVisitor, Opcodes {
static final String GO_DESC = "(" + EPROC_TYPE.getDescriptor() + ")"
+ EOBJECT_DESC;
static final Type EDOUBLE_TYPE = Type.getType(EDouble.class);
static final Type EBIG_TYPE = Type.getType(EBig.class);
static final Type ENIL_TYPE = Type.getType(ENil.class);
static final Type EATOM_TYPE = Type.getType(EAtom.class);
static final Type ETUPLE_TYPE = Type.getType(ETuple.class);
Expand All @@ -160,6 +162,7 @@ public class CompilerVisitor implements ModuleVisitor, Opcodes {
static final String ETUPLE_NAME = ETUPLE_TYPE.getInternalName();
static final String ERT_NAME = ERT_TYPE.getInternalName();
static final String EDOUBLE_NAME = EDOUBLE_TYPE.getInternalName();
static final String EBIG_NAME = EBIG_TYPE.getInternalName();
static final String EINTEGER_NAME = EINTEGER_TYPE.getInternalName();
static final String ENIL_NAME = ENIL_TYPE.getInternalName();
static final String ESEQ_NAME = ESEQ_TYPE.getInternalName();
Expand Down Expand Up @@ -1675,10 +1678,15 @@ private Type push_immediate(EObject value, Type stack_type) {
return EATOM_TYPE;
}

// Handle conversions to primitive Java types:
if (stack_type.getSort() != Type.OBJECT) {
if (value instanceof ESmall) {
mv.visitLdcInsn(new Integer(value.asInt()));
return Type.INT_TYPE;
} else if (value instanceof EBig && stack_type.getSort() == Type.DOUBLE) {
push_immediate(value, EBIG_TYPE);
mv.visitMethodInsn(INVOKEVIRTUAL, EBIG_NAME, "doubleValue", "()D");
return Type.DOUBLE_TYPE;
} else if (value instanceof EDouble) {
mv.visitLdcInsn(new Double(((EDouble) value).value));
return Type.DOUBLE_TYPE;
Expand Down

0 comments on commit d10d144

Please sign in to comment.