Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Implement CStr REPR on JVM.
  • Loading branch information
arnsholt committed Nov 2, 2013
1 parent 11384fe commit 5212954
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
17 changes: 15 additions & 2 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/NativeCallOps.java
Expand Up @@ -3,11 +3,14 @@
import com.sun.jna.NativeLibrary;
import com.sun.jna.Pointer;

import static org.perl6.nqp.runtime.CallSiteDescriptor.*;

import org.perl6.nqp.sixmodel.REPR;
import org.perl6.nqp.sixmodel.REPRRegistry;
import org.perl6.nqp.sixmodel.SixModelObject;

import org.perl6.nqp.sixmodel.reprs.CPointerInstance;
import org.perl6.nqp.sixmodel.reprs.CStrInstance;
import org.perl6.nqp.sixmodel.reprs.NativeCallInstance;
import org.perl6.nqp.sixmodel.reprs.NativeCallBody;
import org.perl6.nqp.sixmodel.reprs.NativeCallBody.ArgType;
Expand Down Expand Up @@ -67,6 +70,7 @@ public static SixModelObject call(SixModelObject returns, SixModelObject callObj
/* Wrap returned in the appropriate REPR type. */
return toNQPType(tc, call.ret_type, returns, returned);
}
catch (ControlException e) { throw e; }
catch (Throwable t) {
throw ExceptionHandling.dieInternal(tc, t);
}
Expand Down Expand Up @@ -140,9 +144,18 @@ private static Object toJNAType(ThreadContext tc, SixModelObject o, ArgType targ
return new Double((double) o.get_num(tc));
case ASCIISTR:
case UTF8STR:
case UTF16STR:
case UTF16STR: {
/* TODO: Handle encodings. */
return o.get_str(tc);
SixModelObject meth = Ops.findmethod(o, "cstr", tc);
if (meth != null) {
Ops.invokeDirect(tc, meth, new CallSiteDescriptor(new byte[] { ARG_OBJ }, null), new Object[] { o });
CStrInstance cstr = (CStrInstance) Ops.decont(Ops.result_o(tc.resultFrame()), tc);
return cstr.cstr;
}
else {
return o.get_str(tc);
}
}
case CPOINTER:
return ((CPointerInstance) o).pointer;
default:
Expand Down
@@ -1,7 +1,22 @@
package org.perl6.nqp.sixmodel.reprs;

import com.sun.jna.Memory;
import com.sun.jna.Native;

import org.perl6.nqp.runtime.ThreadContext;
import org.perl6.nqp.sixmodel.SixModelObject;

public class CStrInstance extends SixModelObject {
/* Nothing here yet. */
public Memory cstr;

public void set_str(ThreadContext tc, String value) {
/* TODO: Handle encodings. */
byte[] bytes = Native.toByteArray(value);
cstr = new Memory(bytes.length);
cstr.write(0, bytes, 0, bytes.length);
}

public String get_str(ThreadContext tc) {
return cstr.getString(0, Native.getDefaultStringEncoding());
}
}

0 comments on commit 5212954

Please sign in to comment.