diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java index 7e6193122e64c39b05bf20a4d00d8ba8407807ab..afe1fbe86e60e3a01bf8ecf1449578dbb6bce7e1 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/common/JavaUpCallsRFFIImpl.java @@ -413,14 +413,14 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { @Override @TruffleBoundary public int Rf_error(String msg) { - RError.error(RError.SHOW_CALLER2, RError.Message.GENERIC, msg); + RError.error(RError.SHOW_CALLER, RError.Message.GENERIC, msg); return 0; } @Override @TruffleBoundary public int Rf_warning(String msg) { - RError.warning(RError.SHOW_CALLER2, RError.Message.GENERIC, msg); + RError.warning(RError.SHOW_CALLER, RError.Message.GENERIC, msg); return 0; } @@ -443,7 +443,7 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { public Object Rf_allocVector(int mode, long n) { SEXPTYPE type = SEXPTYPE.mapInt(mode); if (n > Integer.MAX_VALUE) { - throw RError.error(RError.SHOW_CALLER2, RError.Message.LONG_VECTORS_NOT_SUPPORTED); + throw RError.error(RError.SHOW_CALLER, RError.Message.LONG_VECTORS_NOT_SUPPORTED); // TODO check long vector } int ni = (int) n; @@ -676,6 +676,11 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { throw implementedAsNode(); } + @Override + public Object CAAR(Object e) { + throw implementedAsNode(); + } + @Override public Object CDR(Object e) { throw implementedAsNode(); @@ -686,16 +691,36 @@ public abstract class JavaUpCallsRFFIImpl implements UpCallsRFFI { throw implementedAsNode(); } + @Override + public Object CDAR(Object e) { + throw implementedAsNode(); + } + @Override public Object CADDR(Object e) { throw implementedAsNode(); } + @Override + public Object CADDDR(Object e) { + throw implementedAsNode(); + } + + @Override + public Object CAD4R(Object e) { + throw implementedAsNode(); + } + @Override public Object CDDR(Object e) { throw implementedAsNode(); } + @Override + public Object CDDDR(Object e) { + throw implementedAsNode(); + } + @Override public Object SET_TAG(Object x, Object y) { if (x instanceof RPairList) { diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java index 29acb7dd3326cb9fe09943a379022510621ffafd..3279573549545bf005d13825528ed7558f12d6f2 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nfi/TruffleNFI_DLL.java @@ -51,8 +51,8 @@ public class TruffleNFI_DLL implements DLLRFFI { private static class TruffleNFI_DLOpenNode extends Node implements DLLRFFI.DLOpenNode { - @TruffleBoundary @Override + @TruffleBoundary public Object execute(String path, boolean local, boolean now) { String libName = DLL.libName(path); Env env = RContext.getInstance().getEnv(); @@ -77,6 +77,7 @@ public class TruffleNFI_DLL implements DLLRFFI { private static class TruffleNFI_DLSymNode extends Node implements DLLRFFI.DLSymNode { @Override + @TruffleBoundary public SymbolHandle execute(Object handle, String symbol) { assert handle instanceof NFIHandle; NFIHandle nfiHandle = (NFIHandle) handle; diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java index 051567f2a264727f4d7270ee5f5f7cedb51629d5..9e8c18a8c8da56b9fea99f90ae32870a4102a380 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/nodes/ListAccessNodes.java @@ -26,9 +26,14 @@ import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Fallback; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.dsl.TypeSystemReference; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CAARNodeGen; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CAD4RNodeGen; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADDDRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADDRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CADRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CARNodeGen; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDARNodeGen; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDDDRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDDRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.CDRNodeGen; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodesFactory.SETCARNodeGen; @@ -94,6 +99,22 @@ public final class ListAccessNodes { } } + @TypeSystemReference(RTypes.class) + public abstract static class CAARNode extends FFIUpCallNode.Arg1 { + + @Child private CARNode car1 = CARNode.create(); + @Child private CARNode car2 = CARNode.create(); + + @Specialization + protected Object caar(Object value) { + return car2.executeObject(car1.executeObject(value)); + } + + public static CAARNode create() { + return CAARNodeGen.create(); + } + } + @TypeSystemReference(RTypes.class) public static final class SETCADRNode extends FFIUpCallNode.Arg2 { @Child private SETCARNode setcarNode = SETCARNode.create(); @@ -196,6 +217,21 @@ public final class ListAccessNodes { } } + @TypeSystemReference(RTypes.class) + public abstract static class CDARNode extends FFIUpCallNode.Arg1 { + @Child private CARNode car = CARNode.create(); + @Child private CDRNode cdr = CDRNode.create(); + + @Specialization + protected Object cdar(Object value) { + return cdr.executeObject(car.executeObject(value)); + } + + public static CDARNode create() { + return CDARNodeGen.create(); + } + } + @TypeSystemReference(RTypes.class) public abstract static class CADDRNode extends FFIUpCallNode.Arg1 { @Specialization @@ -218,6 +254,52 @@ public final class ListAccessNodes { } } + @TypeSystemReference(RTypes.class) + public abstract static class CADDDRNode extends FFIUpCallNode.Arg1 { + @Specialization + protected Object cadddr(RPairList pl) { + RPairList tmp = (RPairList) pl.cddr(); + return tmp.cadr(); + } + + @Specialization + protected Object cadddr(RLanguage lang) { + return lang.getDataAtAsObject(3); + } + + @Fallback + protected Object cadddr(@SuppressWarnings("unused") Object obj) { + throw RInternalError.unimplemented("CADDDR only works on pair lists and language objects"); + } + + public static CADDDRNode create() { + return CADDDRNodeGen.create(); + } + } + + @TypeSystemReference(RTypes.class) + public abstract static class CAD4RNode extends FFIUpCallNode.Arg1 { + @Specialization + protected Object cad4r(RPairList pl) { + RPairList tmp = (RPairList) pl.cddr(); + return tmp.caddr(); + } + + @Specialization + protected Object cad4r(RLanguage lang) { + return lang.getDataAtAsObject(4); + } + + @Fallback + protected Object cad4r(@SuppressWarnings("unused") Object obj) { + throw RInternalError.unimplemented("CAD4R only works on pair lists and language objects"); + } + + public static CAD4RNode create() { + return CAD4RNodeGen.create(); + } + } + @TypeSystemReference(RTypes.class) public abstract static class CDDRNode extends FFIUpCallNode.Arg1 { @Specialization @@ -226,7 +308,7 @@ public final class ListAccessNodes { } @Specialization - protected Object cdr(RLanguage lang) { + protected Object cddr(RLanguage lang) { RPairList l = lang.getPairList(); return l.cddr(); } @@ -240,4 +322,27 @@ public final class ListAccessNodes { return CDDRNodeGen.create(); } } + + @TypeSystemReference(RTypes.class) + public abstract static class CDDDRNode extends FFIUpCallNode.Arg1 { + @Specialization + protected Object cdddr(RPairList pl) { + return pl.cddr(); + } + + @Specialization + protected Object cdddr(RLanguage lang) { + RPairList l = (RPairList) lang.getPairList().cddr(); + return l.cdr(); + } + + @Fallback + protected Object cdddr(@SuppressWarnings("unused") Object obj) { + throw RInternalError.unimplemented("CDDDR only works on pair lists and language objects"); + } + + public static CDDDRNode create() { + return CDDDRNodeGen.create(); + } + } } diff --git a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java index 26c9a460b1d6acf3acc07c15c69512b50dd4cbd0..9138e92393ae206aee397b439c9c9932c1b45a01 100644 --- a/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java +++ b/com.oracle.truffle.r.ffi.impl/src/com/oracle/truffle/r/ffi/impl/upcalls/StdUpCallsRFFI.java @@ -34,9 +34,14 @@ import com.oracle.truffle.r.ffi.impl.nodes.CoerceNodes.VectorToPairListNode; import com.oracle.truffle.r.ffi.impl.nodes.DuplicateNodes; import com.oracle.truffle.r.ffi.impl.nodes.EnvNodes.LockBindingNode; import com.oracle.truffle.r.ffi.impl.nodes.EnvNodes.UnlockBindingNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CAARNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CAD4RNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADDDRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADDRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CADRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CARNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDARNode; +import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDDDRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDDRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.CDRNode; import com.oracle.truffle.r.ffi.impl.nodes.ListAccessNodes.SETCADRNode; @@ -200,18 +205,33 @@ public interface StdUpCallsRFFI { @RFFIUpCallNode(CARNode.class) Object CAR(Object e); + @RFFIUpCallNode(CAARNode.class) + Object CAAR(Object e); + @RFFIUpCallNode(CDRNode.class) Object CDR(Object e); + @RFFIUpCallNode(CDARNode.class) + Object CDAR(Object e); + @RFFIUpCallNode(CADRNode.class) Object CADR(Object e); @RFFIUpCallNode(CADDRNode.class) Object CADDR(Object e); + @RFFIUpCallNode(CADDDRNode.class) + Object CADDDR(Object e); + + @RFFIUpCallNode(CAD4RNode.class) + Object CAD4R(Object e); + @RFFIUpCallNode(CDDRNode.class) Object CDDR(Object e); + @RFFIUpCallNode(CDDDRNode.class) + Object CDDDR(Object e); + Object SET_TAG(Object x, Object y); @RFFIUpCallNode(SETCARNode.class) diff --git a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h index c149521873dc4873790bfccbdbc133571cc5e9d6..faf4a45a09695111a4a4b722f1a434f4a2daa4c4 100644 --- a/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h +++ b/com.oracle.truffle.r.native/fficall/src/common/rffi_upcallsindex.h @@ -3,174 +3,179 @@ #define RFFI_UPCALLSINDEX_H #define ATTRIB_x 0 -#define CADDR_x 1 -#define CADR_x 2 -#define CAR_x 3 -#define CDDR_x 4 -#define CDR_x 5 -#define CLOENV_x 6 -#define COMPLEX_x 7 -#define DUPLICATE_ATTRIB_x 8 -#define ENCLOS_x 9 -#define FASTR_getConnectionChar_x 10 -#define GetRNGstate_x 11 -#define INTEGER_x 12 -#define IS_S4_OBJECT_x 13 -#define LENGTH_x 14 -#define LOGICAL_x 15 -#define NAMED_x 16 -#define OBJECT_x 17 -#define PRCODE_x 18 -#define PRENV_x 19 -#define PRINTNAME_x 20 -#define PRSEEN_x 21 -#define PRVALUE_x 22 -#define PutRNGstate_x 23 -#define RAW_x 24 -#define RDEBUG_x 25 -#define REAL_x 26 -#define RSTEP_x 27 -#define R_BaseEnv_x 28 -#define R_BaseNamespace_x 29 -#define R_BindingIsLocked_x 30 -#define R_CHAR_x 31 -#define R_CleanUp_x 32 -#define R_ExternalPtrAddr_x 33 -#define R_ExternalPtrProtected_x 34 -#define R_ExternalPtrTag_x 35 -#define R_FindNamespace_x 36 -#define R_GetConnection_x 37 -#define R_GlobalContext_x 38 -#define R_GlobalEnv_x 39 -#define R_Home_x 40 -#define R_HomeDir_x 41 -#define R_Interactive_x 42 -#define R_LockBinding_x 43 -#define R_MakeExternalPtr_x 44 -#define R_MethodsNamespace_x 45 -#define R_NamespaceRegistry_x 46 -#define R_NewHashedEnv_x 47 -#define R_ParseVector_x 48 -#define R_PreserveObject_x 49 -#define R_PromiseExpr_x 50 -#define R_ProtectWithIndex_x 51 -#define R_ReadConnection_x 52 -#define R_ReleaseObject_x 53 -#define R_Reprotect_x 54 -#define R_SetExternalPtrAddr_x 55 -#define R_SetExternalPtrProtected_x 56 -#define R_SetExternalPtrTag_x 57 -#define R_TempDir_x 58 -#define R_ToplevelExec_x 59 -#define R_WriteConnection_x 60 -#define R_alloc_x 61 -#define R_compute_identical_x 62 -#define R_do_MAKE_CLASS_x 63 -#define R_do_new_object_x 64 -#define R_do_slot_x 65 -#define R_do_slot_assign_x 66 -#define R_getClassDef_x 67 -#define R_getContextCall_x 68 -#define R_getContextEnv_x 69 -#define R_getContextFun_x 70 -#define R_getContextSrcRef_x 71 -#define R_getGlobalFunctionContext_x 72 -#define R_getParentFunctionContext_x 73 -#define R_has_slot_x 74 -#define R_insideBrowser_x 75 -#define R_isEqual_x 76 -#define R_isGlobal_x 77 -#define R_lsInternal3_x 78 -#define R_new_custom_connection_x 79 -#define R_tryEval_x 80 -#define R_unLockBinding_x 81 -#define Rf_GetOption1_x 82 -#define Rf_NonNullStringMatch_x 83 -#define Rf_PairToVectorList_x 84 -#define Rf_ScalarDouble_x 85 -#define Rf_ScalarInteger_x 86 -#define Rf_ScalarLogical_x 87 -#define Rf_ScalarString_x 88 -#define Rf_VectorToPairList_x 89 -#define Rf_allocArray_x 90 -#define Rf_allocMatrix_x 91 -#define Rf_allocVector_x 92 -#define Rf_any_duplicated_x 93 -#define Rf_asChar_x 94 -#define Rf_asCharacterFactor_x 95 -#define Rf_asInteger_x 96 -#define Rf_asLogical_x 97 -#define Rf_asReal_x 98 -#define Rf_classgets_x 99 -#define Rf_coerceVector_x 100 -#define Rf_cons_x 101 -#define Rf_copyListMatrix_x 102 -#define Rf_copyMatrix_x 103 -#define Rf_copyMostAttrib_x 104 -#define Rf_defineVar_x 105 -#define Rf_dunif_x 106 -#define Rf_duplicate_x 107 -#define Rf_error_x 108 -#define Rf_errorcall_x 109 -#define Rf_eval_x 110 -#define Rf_findFun_x 111 -#define Rf_findVar_x 112 -#define Rf_findVarInFrame_x 113 -#define Rf_findVarInFrame3_x 114 -#define Rf_getAttrib_x 115 -#define Rf_gsetVar_x 116 -#define Rf_inherits_x 117 -#define Rf_install_x 118 -#define Rf_installChar_x 119 -#define Rf_isNull_x 120 -#define Rf_isString_x 121 -#define Rf_lengthgets_x 122 -#define Rf_match_x 123 -#define Rf_mkCharLenCE_x 124 -#define Rf_namesgets_x 125 -#define Rf_ncols_x 126 -#define Rf_nrows_x 127 -#define Rf_protect_x 128 -#define Rf_punif_x 129 -#define Rf_qunif_x 130 -#define Rf_runif_x 131 -#define Rf_setAttrib_x 132 -#define Rf_str2type_x 133 -#define Rf_unprotect_x 134 -#define Rf_unprotect_ptr_x 135 -#define Rf_warning_x 136 -#define Rf_warningcall_x 137 -#define Rprintf_x 138 -#define SETCADR_x 139 -#define SETCAR_x 140 -#define SETCDR_x 141 -#define SET_NAMED_FASTR_x 142 -#define SET_RDEBUG_x 143 -#define SET_RSTEP_x 144 -#define SET_S4_OBJECT_x 145 -#define SET_STRING_ELT_x 146 -#define SET_SYMVALUE_x 147 -#define SET_TAG_x 148 -#define SET_TYPEOF_FASTR_x 149 -#define SET_VECTOR_ELT_x 150 -#define STRING_ELT_x 151 -#define SYMVALUE_x 152 -#define TAG_x 153 -#define TYPEOF_x 154 -#define UNSET_S4_OBJECT_x 155 -#define VECTOR_ELT_x 156 -#define forceSymbols_x 157 -#define getCCallable_x 158 -#define getConnectionClassString_x 159 -#define getOpenModeString_x 160 -#define getSummaryDescription_x 161 -#define isSeekable_x 162 -#define registerCCallable_x 163 -#define registerRoutines_x 164 -#define setDotSymbolValues_x 165 -#define unif_rand_x 166 -#define useDynamicSymbols_x 167 +#define CAAR_x 1 +#define CAD4R_x 2 +#define CADDDR_x 3 +#define CADDR_x 4 +#define CADR_x 5 +#define CAR_x 6 +#define CDAR_x 7 +#define CDDDR_x 8 +#define CDDR_x 9 +#define CDR_x 10 +#define CLOENV_x 11 +#define COMPLEX_x 12 +#define DUPLICATE_ATTRIB_x 13 +#define ENCLOS_x 14 +#define FASTR_getConnectionChar_x 15 +#define GetRNGstate_x 16 +#define INTEGER_x 17 +#define IS_S4_OBJECT_x 18 +#define LENGTH_x 19 +#define LOGICAL_x 20 +#define NAMED_x 21 +#define OBJECT_x 22 +#define PRCODE_x 23 +#define PRENV_x 24 +#define PRINTNAME_x 25 +#define PRSEEN_x 26 +#define PRVALUE_x 27 +#define PutRNGstate_x 28 +#define RAW_x 29 +#define RDEBUG_x 30 +#define REAL_x 31 +#define RSTEP_x 32 +#define R_BaseEnv_x 33 +#define R_BaseNamespace_x 34 +#define R_BindingIsLocked_x 35 +#define R_CHAR_x 36 +#define R_CleanUp_x 37 +#define R_ExternalPtrAddr_x 38 +#define R_ExternalPtrProtected_x 39 +#define R_ExternalPtrTag_x 40 +#define R_FindNamespace_x 41 +#define R_GetConnection_x 42 +#define R_GlobalContext_x 43 +#define R_GlobalEnv_x 44 +#define R_Home_x 45 +#define R_HomeDir_x 46 +#define R_Interactive_x 47 +#define R_LockBinding_x 48 +#define R_MakeExternalPtr_x 49 +#define R_MethodsNamespace_x 50 +#define R_NamespaceRegistry_x 51 +#define R_NewHashedEnv_x 52 +#define R_ParseVector_x 53 +#define R_PreserveObject_x 54 +#define R_PromiseExpr_x 55 +#define R_ProtectWithIndex_x 56 +#define R_ReadConnection_x 57 +#define R_ReleaseObject_x 58 +#define R_Reprotect_x 59 +#define R_SetExternalPtrAddr_x 60 +#define R_SetExternalPtrProtected_x 61 +#define R_SetExternalPtrTag_x 62 +#define R_TempDir_x 63 +#define R_ToplevelExec_x 64 +#define R_WriteConnection_x 65 +#define R_alloc_x 66 +#define R_compute_identical_x 67 +#define R_do_MAKE_CLASS_x 68 +#define R_do_new_object_x 69 +#define R_do_slot_x 70 +#define R_do_slot_assign_x 71 +#define R_getClassDef_x 72 +#define R_getContextCall_x 73 +#define R_getContextEnv_x 74 +#define R_getContextFun_x 75 +#define R_getContextSrcRef_x 76 +#define R_getGlobalFunctionContext_x 77 +#define R_getParentFunctionContext_x 78 +#define R_has_slot_x 79 +#define R_insideBrowser_x 80 +#define R_isEqual_x 81 +#define R_isGlobal_x 82 +#define R_lsInternal3_x 83 +#define R_new_custom_connection_x 84 +#define R_tryEval_x 85 +#define R_unLockBinding_x 86 +#define Rf_GetOption1_x 87 +#define Rf_NonNullStringMatch_x 88 +#define Rf_PairToVectorList_x 89 +#define Rf_ScalarDouble_x 90 +#define Rf_ScalarInteger_x 91 +#define Rf_ScalarLogical_x 92 +#define Rf_ScalarString_x 93 +#define Rf_VectorToPairList_x 94 +#define Rf_allocArray_x 95 +#define Rf_allocMatrix_x 96 +#define Rf_allocVector_x 97 +#define Rf_any_duplicated_x 98 +#define Rf_asChar_x 99 +#define Rf_asCharacterFactor_x 100 +#define Rf_asInteger_x 101 +#define Rf_asLogical_x 102 +#define Rf_asReal_x 103 +#define Rf_classgets_x 104 +#define Rf_coerceVector_x 105 +#define Rf_cons_x 106 +#define Rf_copyListMatrix_x 107 +#define Rf_copyMatrix_x 108 +#define Rf_copyMostAttrib_x 109 +#define Rf_defineVar_x 110 +#define Rf_dunif_x 111 +#define Rf_duplicate_x 112 +#define Rf_error_x 113 +#define Rf_errorcall_x 114 +#define Rf_eval_x 115 +#define Rf_findFun_x 116 +#define Rf_findVar_x 117 +#define Rf_findVarInFrame_x 118 +#define Rf_findVarInFrame3_x 119 +#define Rf_getAttrib_x 120 +#define Rf_gsetVar_x 121 +#define Rf_inherits_x 122 +#define Rf_install_x 123 +#define Rf_installChar_x 124 +#define Rf_isNull_x 125 +#define Rf_isString_x 126 +#define Rf_lengthgets_x 127 +#define Rf_match_x 128 +#define Rf_mkCharLenCE_x 129 +#define Rf_namesgets_x 130 +#define Rf_ncols_x 131 +#define Rf_nrows_x 132 +#define Rf_protect_x 133 +#define Rf_punif_x 134 +#define Rf_qunif_x 135 +#define Rf_runif_x 136 +#define Rf_setAttrib_x 137 +#define Rf_str2type_x 138 +#define Rf_unprotect_x 139 +#define Rf_unprotect_ptr_x 140 +#define Rf_warning_x 141 +#define Rf_warningcall_x 142 +#define Rprintf_x 143 +#define SETCADR_x 144 +#define SETCAR_x 145 +#define SETCDR_x 146 +#define SET_NAMED_FASTR_x 147 +#define SET_RDEBUG_x 148 +#define SET_RSTEP_x 149 +#define SET_S4_OBJECT_x 150 +#define SET_STRING_ELT_x 151 +#define SET_SYMVALUE_x 152 +#define SET_TAG_x 153 +#define SET_TYPEOF_FASTR_x 154 +#define SET_VECTOR_ELT_x 155 +#define STRING_ELT_x 156 +#define SYMVALUE_x 157 +#define TAG_x 158 +#define TYPEOF_x 159 +#define UNSET_S4_OBJECT_x 160 +#define VECTOR_ELT_x 161 +#define forceSymbols_x 162 +#define getCCallable_x 163 +#define getConnectionClassString_x 164 +#define getOpenModeString_x 165 +#define getSummaryDescription_x 166 +#define isSeekable_x 167 +#define registerCCallable_x 168 +#define registerRoutines_x 169 +#define setDotSymbolValues_x 170 +#define unif_rand_x 171 +#define useDynamicSymbols_x 172 -#define UPCALLS_TABLE_SIZE 168 +#define UPCALLS_TABLE_SIZE 173 #endif // RFFI_UPCALLSINDEX_H diff --git a/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c b/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c index a715a69fcb1854d606e1389766510ad40c3e5f59..4d6193502941ff2da15d39c2069a0d4a02945dd9 100644 --- a/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c +++ b/com.oracle.truffle.r.native/fficall/src/common/util_fastr.c @@ -5,13 +5,14 @@ * * Copyright (c) 1995-2015, The R Core Team * Copyright (c) 2003, The R Foundation - * Copyright (c) 2015, 2016, Oracle and/or its affiliates + * Copyright (c) 2015, 2017, Oracle and/or its affiliates * * All rights reserved. */ #include <Rinternals.h> #include <stdlib.h> +#include <float.h> #include <R_ext/RS.h> #define _(Source) (Source) @@ -218,3 +219,172 @@ SEXP nthcdr(SEXP s, int n) else error(_("'nthcdr' needs a list to CDR down")); return R_NilValue;/* for -Wall */ } + +#define LDOUBLE double + +double R_strtod5(const char *str, char **endptr, char dec, + Rboolean NA, int exact) +{ + LDOUBLE ans = 0.0, p10 = 10.0, fac = 1.0; + int n, expn = 0, sign = 1, ndigits = 0, exph = -1; + const char *p = str; + + /* optional whitespace */ + while (isspace(*p)) p++; + + if (NA && strncmp(p, "NA", 2) == 0) { + ans = NA_REAL; + p += 2; + goto done; + } + + /* optional sign */ + switch (*p) { + case '-': sign = -1; + case '+': p++; + default: ; + } + + if (strncasecmp(p, "NaN", 3) == 0) { + ans = R_NaN; + p += 3; + goto done; + /* C99 specifies this: must come first to avoid 'inf' match */ + } else if (strncasecmp(p, "infinity", 8) == 0) { + ans = R_PosInf; + p += 8; + goto done; + } else if (strncasecmp(p, "Inf", 3) == 0) { + ans = R_PosInf; + p += 3; + goto done; + } + + if(strlen(p) > 2 && p[0] == '0' && (p[1] == 'x' || p[1] == 'X')) { + /* This will overflow to Inf if appropriate */ + for(p += 2; p; p++) { + if('0' <= *p && *p <= '9') ans = 16*ans + (*p -'0'); + else if('a' <= *p && *p <= 'f') ans = 16*ans + (*p -'a' + 10); + else if('A' <= *p && *p <= 'F') ans = 16*ans + (*p -'A' + 10); + else if(*p == dec) {exph = 0; continue;} + else break; + if (exph >= 0) exph += 4; + } +#define strtod_EXACT_CLAUSE \ + if(exact && ans > 0x1.fffffffffffffp52) { \ + if(exact == NA_LOGICAL) \ + warning(_( \ + "accuracy loss in conversion from \"%s\" to numeric"), \ + str); \ + else { \ + ans = NA_REAL; \ + p = str; /* back out */ \ + goto done; \ + } \ + } + strtod_EXACT_CLAUSE; + if (*p == 'p' || *p == 'P') { + int expsign = 1; + double p2 = 2.0; + switch(*++p) { + case '-': expsign = -1; + case '+': p++; + default: ; + } + /* The test for n is in response to PR#16358; it's not right if the exponent is + very large, but the overflow or underflow below will handle it. */ +#define MAX_EXPONENT_PREFIX 9999 + for (n = 0; *p >= '0' && *p <= '9'; p++) n = (n < MAX_EXPONENT_PREFIX) ? n * 10 + (*p - '0') : n; + if (ans != 0.0) { /* PR#15976: allow big exponents on 0 */ + expn += expsign * n; + if(exph > 0) { + if (expn - exph < -122) { /* PR#17199: fac may overflow below if expn - exph is too small. + 2^-122 is a bit bigger than 1E-37, so should be fine on all systems */ + for (n = exph, fac = 1.0; n; n >>= 1, p2 *= p2) + if (n & 1) fac *= p2; + ans /= fac; + p2 = 2.0; + } else + expn -= exph; + } + if (expn < 0) { + for (n = -expn, fac = 1.0; n; n >>= 1, p2 *= p2) + if (n & 1) fac *= p2; + ans /= fac; + } else { + for (n = expn, fac = 1.0; n; n >>= 1, p2 *= p2) + if (n & 1) fac *= p2; + ans *= fac; + } + } + } + goto done; + } + + for ( ; *p >= '0' && *p <= '9'; p++, ndigits++) ans = 10*ans + (*p - '0'); + if (*p == dec) + for (p++; *p >= '0' && *p <= '9'; p++, ndigits++, expn--) + ans = 10*ans + (*p - '0'); + if (ndigits == 0) { + ans = NA_REAL; + p = str; /* back out */ + goto done; + } + strtod_EXACT_CLAUSE; + + if (*p == 'e' || *p == 'E') { + int expsign = 1; + switch(*++p) { + case '-': expsign = -1; + case '+': p++; + default: ; + } + for (n = 0; *p >= '0' && *p <= '9'; p++) n = (n < MAX_EXPONENT_PREFIX) ? n * 10 + (*p - '0') : n; + expn += expsign * n; + } + + /* avoid unnecessary underflow for large negative exponents */ + if (expn + ndigits < -300) { + for (n = 0; n < ndigits; n++) ans /= 10.0; + expn += ndigits; + } + if (expn < -307) { /* use underflow, not overflow */ + for (n = -expn, fac = 1.0; n; n >>= 1, p10 *= p10) + if (n & 1) fac /= p10; + ans *= fac; + } else if (expn < 0) { /* positive powers are exact */ + for (n = -expn, fac = 1.0; n; n >>= 1, p10 *= p10) + if (n & 1) fac *= p10; + ans /= fac; + } else if (ans != 0.0) { /* PR#15976: allow big exponents on 0, e.g. 0E4933 */ + for (n = expn, fac = 1.0; n; n >>= 1, p10 *= p10) + if (n & 1) fac *= p10; + ans *= fac; + } + + /* explicit overflow to infinity */ + if (ans > DBL_MAX) { + if (endptr) *endptr = (char *) p; + return (sign > 0) ? R_PosInf : R_NegInf; + } + +done: + if (endptr) *endptr = (char *) p; + return sign * (double) ans; +} + + +double R_strtod4(const char *str, char **endptr, char dec, Rboolean NA) +{ + return R_strtod5(str, endptr, dec, NA, FALSE); +} + +double R_strtod(const char *str, char **endptr) +{ + return R_strtod5(str, endptr, '.', FALSE, FALSE); +} + +double R_atof(const char *str) +{ + return R_strtod5(str, NULL, '.', FALSE, FALSE); +} diff --git a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h index 699f70c482838c5ddf4dff0a758f6da1a45add1c..cc43c6ff9c3a6be99e9ca259d73771dfd4ee38fc 100644 --- a/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h +++ b/com.oracle.truffle.r.native/fficall/src/truffle_common/Rinternals_truffle_common.h @@ -663,14 +663,16 @@ SEXP PRINTNAME(SEXP e) { SEXP CAAR(SEXP e) { TRACE0(); - unimplemented("CAAR"); - return NULL; + SEXP result = ((call_CAAR) callbacks[CAAR_x])(e); + checkExitCall(); + return result; } SEXP CDAR(SEXP e) { TRACE0(); - unimplemented("CDAR"); - return NULL; + SEXP result = ((call_CDAR) callbacks[CDAR_x])(e); + checkExitCall(); + return result; } SEXP CADR(SEXP e) { @@ -689,8 +691,9 @@ SEXP CDDR(SEXP e) { SEXP CDDDR(SEXP e) { TRACE0(); - unimplemented("CDDDR"); - return NULL; + SEXP result = ((call_CDDDR) callbacks[CDDDR_x])(e); + checkExitCall(); + return result; } SEXP CADDR(SEXP e) { @@ -702,14 +705,16 @@ SEXP CADDR(SEXP e) { SEXP CADDDR(SEXP e) { TRACE0(); - unimplemented("CADDDR"); - return NULL; + SEXP result = ((call_CADDDR) callbacks[CADDDR_x])(e); + checkExitCall(); + return result; } SEXP CAD4R(SEXP e) { TRACE0(); - unimplemented("CAD4R"); - return NULL; + SEXP result = ((call_CAD4R) callbacks[CAD4R_x])(e); + checkExitCall(); + return result; } int MISSING(SEXP x) { @@ -1364,7 +1369,7 @@ SEXP R_tryEvalSilent(SEXP x, SEXP y, int *ErrorOccurred) { TRACE0(); return R_tryEvalInternal(x, y, ErrorOccurred, 1); } - +/* double R_atof(const char *str) { TRACE0(); unimplemented("R_atof"); @@ -1375,7 +1380,7 @@ double R_strtod(const char *c, char **end) { TRACE0(); unimplemented("R_strtod"); return 0; -} +}*/ SEXP R_PromiseExpr(SEXP x) { TRACE0(); @@ -1509,7 +1514,7 @@ SEXP R_do_slot_assign(SEXP obj, SEXP name, SEXP value) { int R_has_slot(SEXP obj, SEXP name) { TRACE(TARGpp, obj, name); - SEXP result = ((call_R_has_slot) callbacks[R_has_slot_x])(obj, name); + int result = ((call_R_has_slot) callbacks[R_has_slot_x])(obj, name); checkExitCall(); return result; } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java index 015ffea85340b0fbdc899feed463a5a35a43a9dd..acb1b4cd0453de8efff4bf35ef022c694c8327e4 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Capabilities.java @@ -48,7 +48,7 @@ public abstract class Capabilities extends RBuiltinNode.Arg0 { libxml(false, null), fifo(true, null), cledit(false, null), - iconv(false, null), + iconv(true, null), nls(false, "NLS"), profmem(false, null), cairo(false, null), diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java index 56bb231456813d173e3755fea8891b5c7a0fdef0..769b288779887581dabdaab4d381bac80220b5c9 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/DatePOSIXFunctions.java @@ -189,7 +189,7 @@ public class DatePOSIXFunctions { protected RList asPOSIXlt(RAbstractDoubleVector x, String tz) { TimeZone zone; if (tz.isEmpty()) { - zone = RContext.getInstance().getSystemTimeZone(); + zone = RContext.getInstance().stateREnvVars.getSystemTimeZone(); } else { zone = TimeZone.getTimeZone(tz); } @@ -235,7 +235,7 @@ public class DatePOSIXFunctions { RAbstractVector yearVector = (RAbstractVector) RRuntime.convertScalarVectors(x.getDataAt(5)); TimeZone zone; if (tz.isEmpty()) { - zone = RContext.getInstance().getSystemTimeZone(); + zone = RContext.getInstance().stateREnvVars.getSystemTimeZone(); } else { zone = TimeZone.getTimeZone(tz); } @@ -360,7 +360,7 @@ public class DatePOSIXFunctions { builder.appendLiteral(' ').appendZoneText(TextStyle.SHORT); } } else { - zone = RContext.getInstance().getSystemTimeZone().toZoneId(); + zone = RContext.getInstance().stateREnvVars.getSystemTimeZone().toZoneId(); } DateTimeFormatter[] formatters = new DateTimeFormatter[builders.length]; @@ -406,7 +406,7 @@ public class DatePOSIXFunctions { TimeZone zone; String zoneString = RRuntime.asString(tz); if (zoneString.isEmpty()) { - zone = RContext.getInstance().getSystemTimeZone(); + zone = RContext.getInstance().stateREnvVars.getSystemTimeZone(); } else { zone = TimeZone.getTimeZone(zoneString); } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java index 5fc572acadb1e05df9c53596b9fba59c653ca5d4..3feb26bd40ed44046a9738be0352a6de7c17342e 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/EncodeString.java @@ -25,15 +25,14 @@ import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.profiles.BranchProfile; +import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.attributes.UnaryCopyAttributesNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RRuntime; -import com.oracle.truffle.r.runtime.Utils; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RStringVector; -import com.oracle.truffle.r.runtime.data.model.RAbstractIntVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; import com.oracle.truffle.r.runtime.ops.na.NACheck; @@ -63,286 +62,165 @@ public abstract class EncodeString extends RBuiltinNode.Arg5 { casts.arg("na.encode").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).mustBe(notLogicalNA()).map(toBoolean()); } - private int computeWidth(RAbstractStringVector x, int width, final String quote) { - if (!RRuntime.isNA(width)) { - return width == 0 ? 1 : width; + private static StringBuilder append(String source, int offset, StringBuilder str, String snippet) { + if (str == null) { + StringBuilder newStr = new StringBuilder(source.length() + 2); + newStr.append(source, 0, offset); + return newStr.append(snippet); } - int maxElWidth = -1; - na.enable(x); - // Find the element in x with the largest width. - for (int i = 0; i < x.getLength(); i++) { - if (!na.check(x.getDataAt(i))) { - int curLen = x.getDataAt(i).length(); - if (maxElWidth < curLen) { - maxElWidth = curLen; - } - } - } - maxElWidth += quote.length() > 0 ? 2 : 0; // Accounting for the quote. - if (!RRuntime.isNA(width) && width > maxElWidth) { - maxElWidth = width; - } - return maxElWidth; + return str.append(snippet); } @TruffleBoundary - private static String concat(Object... args) { - StringBuilder sb = new StringBuilder(); - for (Object arg : args) { - sb.append(arg); - } - return sb.toString(); - } - - @SuppressWarnings("unused") - @Specialization(guards = {"leftJustify(justify)", "encodeNA"}) - protected RStringVector encodeStringLeftJustifyEncodeNA(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final int maxElWidth = computeWidth(x, width, quoteEl); - final String[] result = new String[x.getLength()]; - na.enable(x); - for (int i = 0; i < x.getLength(); i++) { - String currentEl = x.getDataAt(i); - if (na.check(currentEl)) { - everSeenNA.enter(); - if (quoteEl.isEmpty()) { - currentEl = concat("<", currentEl, ">"); - } - result[i] = Utils.stringFormat(concat("%-", maxElWidth, "s"), currentEl); - } else { - result[i] = Utils.stringFormat(concat("%-", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl)); + private static String encodeString(String value, char quote) { + StringBuilder str = null; + int offset = 0; + while (offset < value.length()) { + int codepoint = value.codePointAt(offset); + switch (codepoint) { + case '\n': + str = append(value, offset, str, "\\n"); + break; + case '\r': + str = append(value, offset, str, "\\r"); + break; + case '\t': + str = append(value, offset, str, "\\t"); + break; + case '\b': + str = append(value, offset, str, "\\b"); + break; + case 7: + str = append(value, offset, str, "\\a"); + break; + case '\f': + str = append(value, offset, str, "\\f"); + break; + case 11: + str = append(value, offset, str, "\\v"); + break; + case '\\': + str = append(value, offset, str, "\\\\"); + break; + case '"': + if (quote == '"') { + str = append(value, offset, str, "\\\""); + } else { + if (str != null) { + str.appendCodePoint(codepoint); + } + } + break; + case '\'': + if (quote == '\'') { + str = append(value, offset, str, "\\'"); + } else { + if (str != null) { + str.appendCodePoint(codepoint); + } + } + break; + default: + if (codepoint < 32 || codepoint == 0x7f) { + str.append("\\").append(codepoint >>> 6).append((codepoint >>> 3) & 0x7).append(codepoint & 0x7); + } else if (codepoint > 64967) { // determined by experimentation + if (codepoint < 0x10000) { + str.append("\\u").append(String.format("%04x", codepoint)); + } else { + str.append("\\U").append(String.format("%08x", codepoint)); + } + } else { + if (str != null) { + str.appendCodePoint(codepoint); + } + } + break; } + offset += Character.charCount(codepoint); } - RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR); - copyAttributesNode.execute(resultVector, x); - return resultVector; + return str == null ? value : str.toString(); } - @SuppressWarnings("unused") - @Specialization(guards = {"leftJustify(justify)", "!encodeNA"}) - protected RStringVector encodeStringLeftJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final int maxElWidth = computeWidth(x, width, quoteEl); - final String[] result = new String[x.getLength()]; - na.enable(x); - boolean seenNA = false; - for (int i = 0; i < x.getLength(); i++) { - final String currentEl = x.getDataAt(i); - if (na.check(currentEl)) { - everSeenNA.enter(); - result[i] = currentEl; - seenNA = true; + @TruffleBoundary + private static String justifyAndQuote(int width, int justify, int quoteLength, char quoteChar, String currentEl) { + String res; + if (currentEl.length() + quoteLength >= width || justify == JUSTIFY.NONE.ordinal()) { + if (quoteLength == 0) { + res = currentEl; } else { - result[i] = Utils.stringFormat(concat("%-", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl)); + res = new StringBuilder(currentEl.length() + quoteLength).append(quoteChar).append(currentEl).append(quoteChar).toString(); } - } - RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA); - copyAttributesNode.execute(resultVector, x); - return resultVector; - } - - @SuppressWarnings("unused") - @Specialization(guards = {"rightJustify(justify)", "encodeNA"}) - protected RStringVector encodeStringRightJustifyEncodeNA(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final int maxElWidth = computeWidth(x, width, quoteEl); - final String[] result = new String[x.getLength()]; - na.enable(x); - for (int i = 0; i < x.getLength(); i++) { - String currentEl = x.getDataAt(i); - if (na.check(currentEl)) { - everSeenNA.enter(); - if (quoteEl.isEmpty()) { - currentEl = concat("<", currentEl, ">"); - } - result[i] = Utils.stringFormat(concat("%", maxElWidth, "s"), currentEl); - } else { - result[i] = Utils.stringFormat(concat("%", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl)); + } else { + StringBuilder str = new StringBuilder(width); + int remainder = width - currentEl.length() - quoteLength; + int before = justify == JUSTIFY.RIGHT.ordinal() ? remainder : justify == JUSTIFY.CENTER.ordinal() ? remainder / 2 : 0; + int whitespaces = 0; + for (; whitespaces < before; whitespaces++) { + str.append(' '); } - } - RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR); - copyAttributesNode.execute(resultVector, x); - return resultVector; - } - - @SuppressWarnings("unused") - @Specialization(guards = {"rightJustify(justify)", "!encodeNA"}) - protected RStringVector encodeStringRightJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final int maxElWidth = computeWidth(x, width, quoteEl); - final String[] result = new String[x.getLength()]; - na.enable(x); - boolean seenNA = false; - for (int i = 0; i < x.getLength(); i++) { - final String currentEl = x.getDataAt(i); - if (na.check(currentEl)) { - everSeenNA.enter(); - result[i] = currentEl; - seenNA = true; - } else { - result[i] = Utils.stringFormat(concat("%", maxElWidth, "s"), concat(quoteEl, currentEl, quoteEl)); + if (quoteLength > 0) { + str.append(quoteChar); } - } - RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA); - copyAttributesNode.execute(resultVector, x); - return resultVector; - } - - @SuppressWarnings("unused") - @Specialization(guards = {"centerJustify(justify)", "encodeNA"}) - protected RStringVector encodeStringCenterJustifyEncodeNA(RAbstractStringVector x, int width, String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final int maxElWidth = computeWidth(x, width, quoteEl); - final String[] result = new String[x.getLength()]; - final int quoteLength = quoteEl.length() > 0 ? 2 : 0; - final int padding = maxElWidth - quoteLength; - - na.enable(x); - for (int i = 0; i < x.getLength(); i++) { - final String currentEl = x.getDataAt(i); - int totalPadding = padding - currentEl.length(); - if (na.check(currentEl)) { - everSeenNA.enter(); - if (quoteEl.isEmpty()) { - // Accounting for <> in <NA> - totalPadding -= 2; - } else { - totalPadding += quoteLength; - } + str.append(currentEl); + if (quoteLength > 0) { + str.append(quoteChar); + } + for (; whitespaces < remainder; whitespaces++) { + str.append(' '); } - final int leftPadding = totalPadding >> 1; - final int rightPadding = totalPadding - leftPadding; - result[i] = addPadding(currentEl, leftPadding, rightPadding, quoteEl); + res = str.toString(); } - RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR); - copyAttributesNode.execute(resultVector, x); - return resultVector; + return res; } - @SuppressWarnings("unused") - @Specialization(guards = {"centerJustify(justify)", "!encodeNA"}) - protected RStringVector encodeStringCenterJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final int maxElWidth = computeWidth(x, width, quoteEl); - final String[] result = new String[x.getLength()]; - final int quoteLength = quoteEl.length() > 0 ? 2 : 0; - final int padding = maxElWidth - quoteLength; + @Specialization + protected RStringVector encodeStringLeftJustifyEncodeNA(RAbstractStringVector x, int width, final String quoteEl, int justify, boolean encodeNA, + @Cached("create()") UnaryCopyAttributesNode copyAttributesNode, + @Cached("createBinaryProfile()") ConditionProfile widthNAProfile, + @Cached("createBinaryProfile()") ConditionProfile encodeNAProfile) { + int quoteLength = quoteEl.isEmpty() ? 0 : 2; // only the first char of quoteEl is used + char quoteChar = quoteEl.isEmpty() ? 0 : quoteEl.charAt(0); + String[] result = new String[x.getLength()]; na.enable(x); - boolean seenNA = false; for (int i = 0; i < x.getLength(); i++) { - final String currentEl = x.getDataAt(i); + String currentEl = x.getDataAt(i); if (na.check(currentEl)) { - everSeenNA.enter(); - result[i] = currentEl; - seenNA = true; + result[i] = RRuntime.STRING_NA; } else { - final int totalPadding = padding - currentEl.length(); - final int leftPadding = totalPadding >> 1; - final int rightPadding = totalPadding - leftPadding; - result[i] = addPaddingIgnoreNA(currentEl, leftPadding, rightPadding, quoteEl); + result[i] = encodeString(currentEl, quoteChar); } } - RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA); - copyAttributesNode.execute(resultVector, x); - return resultVector; - } - - @TruffleBoundary - private static String addPaddingIgnoreNA(final String el, final int leftPadding, final int rightPadding, final String quoteEl) { - final StringBuilder sb = new StringBuilder(); - for (int j = 0; j < leftPadding; j++) { - sb.append(" "); - } - sb.append(quoteEl); - sb.append(el); - sb.append(quoteEl); - for (int j = 0; j < rightPadding; j++) { - sb.append(" "); - } - return sb.toString(); - } - - @TruffleBoundary - private String addPadding(final String el, final int leftPadding, final int rightPadding, final String quoteEl) { - final StringBuilder sb = new StringBuilder(); - for (int j = 0; j < leftPadding; j++) { - sb.append(" "); - } - if (RRuntime.isNA(el)) { - everSeenNA.enter(); - if (quoteEl.isEmpty()) { - sb.append("<"); - sb.append(el); - sb.append(">"); - } else { - sb.append(el); + int maxWidth; + if (widthNAProfile.profile(RRuntime.isNA(width))) { + maxWidth = 0; + for (int i = 0; i < x.getLength(); i++) { + int w; + if (na.check(result[i])) { + w = encodeNA ? 2 + quoteLength : 0; + } else { + w = result[i].length() + quoteLength; + } + maxWidth = Math.max(maxWidth, w); } } else { - sb.append(quoteEl); - sb.append(el); - sb.append(quoteEl); - } - for (int j = 0; j < rightPadding; j++) { - sb.append(" "); + maxWidth = width; } - return sb.toString(); - } - - @SuppressWarnings("unused") - @Specialization(guards = {"noJustify(width, justify)", "encodeNA"}) - protected RStringVector encodeStringNoJustifyEncodeNA(RAbstractStringVector x, int width, String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final String[] result = new String[x.getLength()]; - na.enable(x); + boolean complete = true; for (int i = 0; i < x.getLength(); i++) { - final String currentEl = x.getDataAt(i); + String currentEl = result[i]; if (na.check(currentEl)) { - everSeenNA.enter(); - result[i] = new String(currentEl); - } else { - result[i] = concat(quoteEl, currentEl, quoteEl); - } - } - RStringVector resultVector = RDataFactory.createStringVector(result, RDataFactory.COMPLETE_VECTOR); - copyAttributesNode.execute(resultVector, x); - return resultVector; - } - - @SuppressWarnings("unused") - @Specialization(guards = {"noJustify(width, justify)", "!encodeNA"}) - protected RStringVector encodeStringNoJustify(RAbstractStringVector x, int width, final String quoteEl, RAbstractIntVector justify, boolean encodeNA, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { - final String[] result = new String[x.getLength()]; - na.enable(x); - boolean seenNA = false; - for (int i = 0; i < x.getLength(); i++) { - final String currentEl = x.getDataAt(i); - if (na.check(currentEl)) { - everSeenNA.enter(); - result[i] = currentEl; - seenNA = true; + if (encodeNAProfile.profile(encodeNA)) { + result[i] = justifyAndQuote(maxWidth, justify, 0, (char) 0, quoteLength == 0 ? "<NA>" : "NA"); + } else { + result[i] = RRuntime.STRING_NA; + complete = false; + } } else { - result[i] = concat(quoteEl, currentEl, quoteEl); + result[i] = justifyAndQuote(maxWidth, justify, quoteLength, quoteChar, currentEl); } } - RStringVector resultVector = RDataFactory.createStringVector(result, !seenNA); + RStringVector resultVector = RDataFactory.createStringVector(result, complete); copyAttributesNode.execute(resultVector, x); return resultVector; } - - protected boolean leftJustify(RAbstractIntVector justify) { - return justify.getDataAt(0) == JUSTIFY.LEFT.ordinal(); - } - - protected boolean rightJustify(RAbstractIntVector justify) { - return justify.getDataAt(0) == JUSTIFY.RIGHT.ordinal(); - } - - protected boolean centerJustify(RAbstractIntVector justify) { - return justify.getDataAt(0) == JUSTIFY.CENTER.ordinal(); - } - - protected boolean noJustify(int width, RAbstractIntVector justify) { - return justify.getDataAt(0) == JUSTIFY.NONE.ordinal() || width == 0; - } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java index 6e245e1ed74d87338ed744ce95b59203b8df644d..231aa74701b50991da830aba1d1a51840074e147 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Expression.java @@ -25,6 +25,7 @@ package com.oracle.truffle.r.nodes.builtin.base; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.api.nodes.ExplodeLoop; import com.oracle.truffle.api.profiles.ConditionProfile; @@ -49,7 +50,7 @@ public abstract class Expression extends RBuiltinNode.Arg1 { } @Specialization - @ExplodeLoop + @TruffleBoundary protected Object doExpression(RArgsValuesAndNames args) { Object[] argValues = args.getArguments(); Object[] data = new Object[argValues.length]; diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java index acd936402b30d172f5e88b5444ca3c2a99bc9dc4..ddddd0287c8f0a66953348b28210defd344e5bba 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/FileFunctions.java @@ -913,10 +913,8 @@ public class FileFunctions { if (copyMode || copyDate) { copyOptions = new CopyOption[overwrite ? 2 : 1]; copyOptions[overwrite ? 1 : 0] = StandardCopyOption.COPY_ATTRIBUTES; - } else if (overwrite) { - copyOptions = new CopyOption[1]; } else { - copyOptions = new CopyOption[0]; + copyOptions = new CopyOption[overwrite ? 1 : 0]; } if (overwrite) { copyOptions[0] = StandardCopyOption.REPLACE_EXISTING; @@ -938,20 +936,20 @@ public class FileFunctions { for (int i = 0; i < lenFrom; i++) { String from = vecFrom.getDataAt(i % lenFrom); - String to = vecTo.getDataAt(i % lenTo); - Path fromPathKeepRel = fileSystem.getPath(Utils.tildeExpand(from, true)); - if (toDir != null && !fromPathKeepRel.isAbsolute()) { - to = toDir.resolve(fromPathKeepRel.getFileName()).toString(); - } Path fromPath = fileSystem.getPath(Utils.tildeExpand(from)); + String to = vecTo.getDataAt(i % lenTo); Path toPath = fileSystem.getPath(Utils.tildeExpand(to)); - status[i] = RRuntime.LOGICAL_TRUE; + assert !recursive || toDir != null; + status[i] = RRuntime.LOGICAL_FALSE; try { - if (recursive && Files.isDirectory(fromPath)) { - // to is just one dir (checked above) - boolean copyError = copyDir(fromPath, toPath, copyOptions); - if (copyError) { - status[i] = RRuntime.LOGICAL_FALSE; + if (toDir != null) { + toPath = toDir.resolve(fromPath.getFileName()); + } + if (Files.isDirectory(fromPath)) { + if (recursive) { + assert toDir != null; + // to is just one dir (checked above) + status[i] = RRuntime.asLogical(copyDir(fromPath, toPath, copyOptions)); } } else { // copy to existing files is skipped unless overWrite @@ -960,15 +958,11 @@ public class FileFunctions { * toB Be careful if toPath is a directory, if empty Java will * replace it with a plain file, otherwise the copy will fail */ - if (Files.isDirectory(toPath)) { - Path fromFileNamePath = fromPath.getFileName(); - toPath = toPath.resolve(fromFileNamePath); - } Files.copy(fromPath, toPath, copyOptions); + status[i] = RRuntime.LOGICAL_TRUE; } } } catch (UnsupportedOperationException | IOException ex) { - status[i] = RRuntime.LOGICAL_FALSE; warning(RError.Message.FILE_CANNOT_COPY, from, to, ex.getMessage()); } } @@ -1014,7 +1008,7 @@ public class FileFunctions { private boolean copyDir(Path fromDir, Path toDir, CopyOption[] copyOptions) throws IOException { DirCopy dirCopy = new DirCopy(fromDir, toDir, copyOptions); Files.walkFileTree(fromDir, dirCopy); - return dirCopy.error; + return !dirCopy.error; } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java index c4a74c677561cd9277671d5b3fb91cd98eeb0034..35a9acd0cb58ae18dfc044b702b0fc6a2980f163 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/IConv.java @@ -22,19 +22,34 @@ */ package com.oracle.truffle.r.nodes.builtin.base; -import com.oracle.truffle.api.dsl.Cached; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.size; import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.stringValue; +import static com.oracle.truffle.r.nodes.builtin.CastBuilder.Predef.toBoolean; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.StandardCharsets; +import java.nio.charset.UnsupportedCharsetException; + +import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; +import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.Specialization; -import com.oracle.truffle.api.profiles.ConditionProfile; import com.oracle.truffle.r.nodes.attributes.UnaryCopyAttributesNode; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RError.Message; +import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.r.runtime.RLocale; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.builtins.RBuiltin; +import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RDataFactory; import com.oracle.truffle.r.runtime.data.RStringVector; import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; @@ -46,25 +61,91 @@ public abstract class IConv extends RBuiltinNode.Arg6 { Casts casts = new Casts(IConv.class); casts.arg("x").mustBe(stringValue(), RError.Message.NOT_CHARACTER_VECTOR, "x"); // with default error message, NO_CALLER does not work - casts.arg("from").defaultError(RError.Message.INVALID_ARGUMENT, "from").mustBe(stringValue()).asStringVector().mustBe(size(1)); - casts.arg("to").defaultError(RError.Message.INVALID_ARGUMENT, "to").mustBe(stringValue()).asStringVector().mustBe(size(1)); - casts.arg("sub").defaultError(RError.Message.INVALID_ARGUMENT, "sub").mustBe(stringValue()).asStringVector().mustBe(size(1)); - casts.arg("mark").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE); - casts.arg("toRaw").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE); + casts.arg("from").defaultError(RError.Message.INVALID_ARGUMENT, "from").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst(); + casts.arg("to").defaultError(RError.Message.INVALID_ARGUMENT, "to").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst(); + casts.arg("sub").defaultError(RError.Message.INVALID_ARGUMENT, "sub").mustBe(stringValue()).asStringVector().mustBe(size(1)).findFirst(); + casts.arg("mark").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).map(toBoolean()); + casts.arg("toRaw").asLogicalVector().findFirst(RRuntime.LOGICAL_FALSE).map(toBoolean()); } - @SuppressWarnings("unused") @Specialization - protected RStringVector doIConv(RAbstractStringVector x, Object from, Object to, Object sub, byte mark, byte toRaw, - @Cached("create()") UnaryCopyAttributesNode copyAttributesNode, - @Cached("createBinaryProfile()") ConditionProfile xLengthProfile) { - // TODO implement - RStringVector xv = x.materialize(); - RStringVector result = RDataFactory.createStringVector(xv.getDataCopy(), RDataFactory.COMPLETE_VECTOR); - if (xLengthProfile.profile(result.getLength() == x.getLength())) { + @TruffleBoundary + protected RAbstractStringVector doIConv(RAbstractStringVector x, String from, String to, String sub, @SuppressWarnings("unused") boolean mark, boolean toRaw, + @Cached("create()") UnaryCopyAttributesNode copyAttributesNode) { + + if (toRaw) { + throw RInternalError.unimplemented("iconv with toRaw=TRUE"); + } + + Charset fromCharset = getCharset(from, from, to); + Charset toCharset = getCharset(to, from, to); + boolean complete = x.isComplete(); + if ((fromCharset == StandardCharsets.UTF_8 || fromCharset == StandardCharsets.UTF_16) && (toCharset == StandardCharsets.UTF_8 || toCharset == StandardCharsets.UTF_16)) { + // this conversion cannot change anything + return x; + } else { + // simulate the results of charset conversion + CharsetEncoder encoder = fromCharset.newEncoder(); + CharsetDecoder decoder = toCharset.newDecoder(); + if (RRuntime.isNA(sub)) { + encoder.onUnmappableCharacter(CodingErrorAction.REPORT); + encoder.onMalformedInput(CodingErrorAction.REPORT); + decoder.onUnmappableCharacter(CodingErrorAction.REPORT); + decoder.onMalformedInput(CodingErrorAction.REPORT); + } else if ("byte".equals(sub)) { + // TODO: special mode that inserts <hexcode> + encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); + encoder.onMalformedInput(CodingErrorAction.IGNORE); + decoder.onUnmappableCharacter(CodingErrorAction.IGNORE); + decoder.onMalformedInput(CodingErrorAction.IGNORE); + } else if (sub.isEmpty()) { + encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); + encoder.onMalformedInput(CodingErrorAction.IGNORE); + decoder.onUnmappableCharacter(CodingErrorAction.IGNORE); + decoder.onMalformedInput(CodingErrorAction.IGNORE); + } else { + // ignore encoding errors + encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); + encoder.onMalformedInput(CodingErrorAction.IGNORE); + // TODO: support more than one character in "replacement" + decoder.replaceWith(sub.substring(0, 1)); + decoder.onUnmappableCharacter(CodingErrorAction.REPLACE); + decoder.onMalformedInput(CodingErrorAction.REPLACE); + } + int length = x.getLength(); + String[] data = new String[length]; + for (int i = 0; i < length; i++) { + String value = x.getDataAt(i); + if (!RRuntime.isNA(value)) { + try { + data[i] = decoder.decode(encoder.encode(CharBuffer.wrap(value))).toString(); + } catch (CharacterCodingException e) { + complete = false; + data[i] = RRuntime.STRING_NA; + } + } + } + RStringVector result = RDataFactory.createStringVector(data, complete); copyAttributesNode.execute(result, x); + return result; + } + } + + private Charset getCharset(String name, String from, String to) { + if (name.isEmpty()) { + return RContext.getInstance().stateRLocale.getCharset(RLocale.CTYPE); + } + Charset toCharset; + if ("C".equals(name)) { + toCharset = StandardCharsets.US_ASCII; + } else { + try { + toCharset = Charset.forName(name); + } catch (IllegalCharsetNameException | UnsupportedCharsetException e) { + throw error(Message.UNSUPPORTED_ENCODING_CONVERSION, from, to); + } } - return result; + return toCharset; } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java index ddbc3242d79084bada22a91dce8a1d158374d687..bdc76843617b57f13b7ea6f01304146fd9aa22a3 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/LocaleFunctions.java @@ -33,7 +33,6 @@ import static com.oracle.truffle.r.runtime.builtins.RBehavior.READS_STATE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.PRIMITIVE; -import java.nio.charset.Charset; import java.util.Locale; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -41,6 +40,7 @@ import com.oracle.truffle.api.dsl.Specialization; import com.oracle.truffle.r.nodes.builtin.NodeWithArgumentCasts.Casts; import com.oracle.truffle.r.nodes.builtin.RBuiltinNode; import com.oracle.truffle.r.runtime.RError; +import com.oracle.truffle.r.runtime.RLocale; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.builtins.RBuiltin; import com.oracle.truffle.r.runtime.context.RContext; @@ -52,45 +52,9 @@ import com.oracle.truffle.r.runtime.data.model.RAbstractStringVector; public class LocaleFunctions { - enum LC { - COLLATE(stdDefault()), - CTYPE(stdDefault()), - MONETARY(stdDefault()), - NUMERIC("C"), - TIME(stdDefault()), - MESSAGES(stdDefault()), - PAPER(""), - MEASUREMENT(""); - - private String value; - private String defaultValue; - - LC(String defaultValue) { - this.defaultValue = defaultValue; - } - - static String stdDefault() { - String defLocale = Locale.getDefault().toString() + "_"; - String defCharSet = Charset.defaultCharset().name(); - return defLocale + defCharSet; - } - - private String getLCEnvVar() { - if (value != null) { - return value; - } - String val = RContext.getInstance().stateREnvVars.get("LC_" + name()); - if (val == null) { - return defaultValue; - } else { - return val; - } - } - - private static int getLCCategory(int category) { - return category - 2; - } - } + private static final int LC_ALL = 1; + private static final int MAPPING_START = 2; + private static final RLocale[] MAPPING = new RLocale[]{RLocale.COLLATE, RLocale.CTYPE, RLocale.MONETARY, RLocale.NUMERIC, RLocale.TIME, RLocale.MESSAGES, RLocale.PAPER, RLocale.MEASUREMENT}; @RBuiltin(name = "Sys.getlocale", kind = INTERNAL, parameterNames = {"category"}, behavior = READS_STATE) public abstract static class GetLocale extends RBuiltinNode.Arg1 { @@ -100,33 +64,34 @@ public class LocaleFunctions { CastsHelper.category(casts); } - private static final int[] ALL_CATEGORIES = new int[]{3, 2, 4, 5, 6, 7, 8, 9}; - @Specialization @TruffleBoundary - protected Object getLocale(int category) { - return RDataFactory.createStringVector(getLocaleData(category)); - } - - protected String getLocaleData(int category) { - String data = ""; - if (category == 1) { - // "LC_ALL" + protected static Object getLocale(int category) { + RContext context = RContext.getInstance(); + if (category == LC_ALL) { + String singleRep = RLocale.COLLATE.getRepresentation(context); + for (RLocale locale : RLocale.values()) { + if (locale.isListed() && !locale.getRepresentation(context).equals(singleRep)) { + singleRep = null; + break; + } + } + if (singleRep != null) { + return singleRep; + } StringBuilder sb = new StringBuilder(); - for (int i = 0; i < ALL_CATEGORIES.length; i++) { - String d = getLocaleData(ALL_CATEGORIES[i]); - if (d.length() > 0) { - sb.append(d); - if (i != ALL_CATEGORIES.length - 1) { + for (RLocale locale : RLocale.values()) { + if (locale.isListed()) { + if (sb.length() > 0) { sb.append('/'); } + sb.append(locale.getRepresentation(context)); } } - data = sb.toString(); + return sb.toString(); } else { - data = LC.values()[LC.getLCCategory(category)].getLCEnvVar(); + return MAPPING[category - MAPPING_START].getRepresentation(context); } - return data; } } @@ -139,11 +104,20 @@ public class LocaleFunctions { casts.arg("locale").mustBe(stringValue()).asStringVector().mustBe(singleElement()).findFirst(); } + private static final RLocale[] SET_ALL = new RLocale[]{RLocale.COLLATE, RLocale.CTYPE, RLocale.MONETARY, RLocale.TIME}; + @Specialization @TruffleBoundary - protected Object setLocale(int category, String locale) { - LC.values()[LC.getLCCategory(category)].value = locale; - return locale; + protected Object setLocale(int category, String value) { + RContext context = RContext.getInstance(); + if (category == LC_ALL) { + for (RLocale locale : SET_ALL) { + context.stateRLocale.setLocale(locale, value); + } + } else { + context.stateRLocale.setLocale(MAPPING[category - MAPPING_START], value); + } + return GetLocale.getLocale(category); } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java index a82f8b5c896ed67db5cfd5801c7bf9475c6db031..ac41e8e5355ab9c72624c983bcef21c60928aa89 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Order.java @@ -18,9 +18,11 @@ import static com.oracle.truffle.r.runtime.RError.Message.INVALID_LOGICAL; import static com.oracle.truffle.r.runtime.builtins.RBehavior.PURE; import static com.oracle.truffle.r.runtime.builtins.RBuiltinKind.INTERNAL; +import java.text.CollationKey; import java.text.Collator; import java.text.ParseException; import java.text.RuleBasedCollator; +import java.util.Locale; import com.oracle.truffle.api.CompilerDirectives; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; @@ -39,9 +41,11 @@ import com.oracle.truffle.r.nodes.unary.CastToVectorNode; import com.oracle.truffle.r.nodes.unary.CastToVectorNodeGen; import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.r.runtime.RLocale; import com.oracle.truffle.r.runtime.RRuntime; import com.oracle.truffle.r.runtime.RType; import com.oracle.truffle.r.runtime.builtins.RBuiltin; +import com.oracle.truffle.r.runtime.context.RContext; import com.oracle.truffle.r.runtime.data.RArgsValuesAndNames; import com.oracle.truffle.r.runtime.data.RComplex; import com.oracle.truffle.r.runtime.data.RDataFactory; @@ -76,17 +80,13 @@ public abstract class Order extends RPrecedenceBuiltinNode { private static final int[] SINCS = {1073790977, 268460033, 67121153, 16783361, 4197377, 1050113, 262913, 65921, 16577, 4193, 1073, 281, 77, 23, 8, 1, 0}; - private RIntVector executeOrderVector1(RAbstractVector v, byte naLast, boolean dec) { - return executeOrderVector1(v, naLast, dec, false); - } - - private RIntVector executeOrderVector1(RAbstractVector vIn, byte naLast, boolean dec, boolean needsStringCollation) { + private RIntVector executeOrderVector1(RAbstractVector vIn, byte naLast, boolean dec) { RAbstractVector v = vectorProfile.profile(vIn); int n = v.getLength(); reportWork(n); int[] indx = createIndexes(v, n, naLast); - initOrderVector1(needsStringCollation).execute(indx, v, naLast, dec, null); + initOrderVector1().execute(indx, v, naLast, dec, true); for (int i = 0; i < indx.length; i++) { indx[i] = indx[i] + 1; } @@ -134,10 +134,10 @@ public abstract class Order extends RPrecedenceBuiltinNode { return result; } - private OrderVector1Node initOrderVector1(boolean needsStringCollation) { - if (orderVector1Node == null || needsStringCollation && !orderVector1Node.needsStringCollation) { + private OrderVector1Node initOrderVector1() { + if (orderVector1Node == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - orderVector1Node = insert(OrderVector1NodeGen.create(needsStringCollation)); + orderVector1Node = insert(OrderVector1NodeGen.create()); } return orderVector1Node; } @@ -198,35 +198,19 @@ public abstract class Order extends RPrecedenceBuiltinNode { } @Specialization(guards = {"oneVec(args)", "isFirstStringPrecedence(args)"}) - Object orderString(byte naLast, boolean decreasing, RArgsValuesAndNames args, - @Cached("create()") BranchProfile collationProfile) { + Object orderString(byte naLast, boolean decreasing, RArgsValuesAndNames args) { RAbstractStringVector v = (RAbstractStringVector) castVector(args.getArgument(0)); - int n = v.getLength(); - boolean needsCollation = false; - outer: for (int i = 0; i < n; i++) { - String str = v.getDataAt(i); - for (int i2 = 0; i2 < str.length(); i2++) { - char c = str.charAt(i2); - if (c > 127) { - collationProfile.enter(); - needsCollation = true; - break outer; - } - } - } - - return executeOrderVector1(v, naLast, decreasing, needsCollation); + return executeOrderVector1(v, naLast, decreasing); } - @Specialization(guards = {"oneVec(args)", "isFirstComplexPrecedence( args)"}) + @Specialization(guards = {"oneVec(args)", "isFirstComplexPrecedence(args)"}) Object orderComplex(byte naLast, boolean decreasing, RArgsValuesAndNames args) { RAbstractComplexVector v = (RAbstractComplexVector) castVector(args.getArgument(0)); return executeOrderVector1(v, naLast, decreasing); } - @SuppressWarnings("unused") - @Specialization(guards = {"oneVec(args)", "isFirstListPrecedence( args)"}) - Object orderList(byte naLast, boolean decreasing, RArgsValuesAndNames args) { + @Specialization(guards = {"oneVec(args)", "isFirstListPrecedence(args)"}) + Object orderList(@SuppressWarnings("unused") byte naLast, @SuppressWarnings("unused") boolean decreasing, RArgsValuesAndNames args) { /* * Lists are not actually supported by GnuR but there is a corner case of a length < 2 list * that produces a result in GnuR and there is a unit test for that (when called via @@ -261,6 +245,9 @@ public abstract class Order extends RPrecedenceBuiltinNode { return n; } + /* + * TODO: multi-element order does not honor string collation. + */ @Specialization(guards = {"!oneVec(args)", "!noVec(args)"}) Object orderMulti(byte naLast, boolean decreasing, RArgsValuesAndNames args, @Cached("createEqualityProfile()") ValueProfile lengthProfile) { @@ -320,25 +307,20 @@ public abstract class Order extends RPrecedenceBuiltinNode { * Also used by {@link Rank}, where the "rho" parameter is not null. TODO handle S4 objects * (which involves rho) */ + abstract static class OrderVector1Node extends RBaseNode { private final ConditionProfile decProfile = ConditionProfile.createBinaryProfile(); - private final boolean needsStringCollation; - - protected OrderVector1Node(boolean needsStringCollation) { - this.needsStringCollation = needsStringCollation; - } - - public abstract Object execute(int[] v, Object dv, byte naLast, boolean dec, Object rho); + public abstract Object execute(int[] v, Object dv, byte naLast, boolean dec, boolean sortNA); @Specialization - protected Object orderVector1(int[] indx, RAbstractIntVector dv, byte naLast, boolean decreasing, Object rho) { + protected Object orderVector1(int[] indx, RAbstractIntVector dv, byte naLast, boolean decreasing, boolean sortNA) { if (indx.length < 2) { return indx; } int lo = 0; int hi = indx.length - 1; - if (rho == null) { + if (sortNA) { int numNa = 0; if (!dv.isComplete() && !RRuntime.isNA(naLast)) { boolean[] isNa = new boolean[indx.length]; @@ -370,13 +352,13 @@ public abstract class Order extends RPrecedenceBuiltinNode { } @Specialization - protected Object orderVector1(int[] indx, RAbstractDoubleVector dv, byte naLast, boolean decreasing, Object rho) { + protected Object orderVector1(int[] indx, RAbstractDoubleVector dv, byte naLast, boolean decreasing, boolean sortNA) { if (indx.length < 2) { return indx; } int lo = 0; int hi = indx.length - 1; - if (rho == null && !RRuntime.isNA(naLast)) { + if (sortNA && !RRuntime.isNA(naLast)) { int numNa = 0; boolean[] isNa = new boolean[indx.length]; for (int i = 0; i < isNa.length; i++) { @@ -406,13 +388,13 @@ public abstract class Order extends RPrecedenceBuiltinNode { } @Specialization - protected Object orderVector1(int[] indx, RAbstractStringVector dv, byte naLast, boolean decreasing, Object rho) { + protected Object orderVector1(int[] indx, RAbstractStringVector dv, byte naLast, boolean decreasing, boolean sortNA) { if (indx.length < 2) { return indx; } int lo = 0; int hi = indx.length - 1; - if (rho == null) { + if (sortNA) { int numNa = 0; if (!dv.isComplete() && !RRuntime.isNA(naLast)) { boolean[] isNa = new boolean[indx.length]; @@ -444,13 +426,13 @@ public abstract class Order extends RPrecedenceBuiltinNode { } @Specialization - protected Object orderVector1(int[] indx, RAbstractComplexVector dv, byte naLast, boolean decreasing, Object rho) { + protected Object orderVector1(int[] indx, RAbstractComplexVector dv, byte naLast, boolean decreasing, boolean sortNA) { if (indx.length < 2) { return indx; } int lo = 0; int hi = indx.length - 1; - if (rho == null) { + if (sortNA) { int numNa = 0; if (!dv.isComplete() && !RRuntime.isNA(naLast)) { boolean[] isNa = new boolean[indx.length]; @@ -483,7 +465,7 @@ public abstract class Order extends RPrecedenceBuiltinNode { @SuppressWarnings("unused") @Specialization - protected Object orderVector1(int[] indx, RList dv, byte naLast, boolean decreasing, Object rho) { + protected Object orderVector1(int[] indx, RList dv, byte naLast, boolean decreasing, boolean sortNA) { /* Only needed to satisfy .Internal(rank) in unit test */ return indx; } @@ -544,61 +526,76 @@ public abstract class Order extends RPrecedenceBuiltinNode { } } + @TruffleBoundary private void sort(int[] indx, RAbstractStringVector dv, int lo, int hi, boolean dec) { - Collator collator = createCollator(); int t = 0; for (; SINCS[t] > hi - lo + 1; t++) { } - for (int h = SINCS[t]; t < 16; h = SINCS[++t]) { - for (int i = lo + h; i <= hi; i++) { - int itmp = indx[i]; - int j = i; - while (j >= lo + h) { - int a = indx[j - h]; - int b = itmp; - int c = compareString(collator, dv.getDataAt(a), dv.getDataAt(b)); - if (decProfile.profile(dec)) { - if (!(c < 0 || (c == 0 && a > b))) { - break; - } - } else { - if (!(c > 0 || (c == 0 && a > b))) { - break; + + Locale locale = RContext.getInstance().stateRLocale.getLocale(RLocale.COLLATE); + if (locale == Locale.ROOT) { + // simple comparison based on numeric value of characters + for (int h = SINCS[t]; t < 16; h = SINCS[++t]) { + for (int i = lo + h; i <= hi; i++) { + int itmp = indx[i]; + int j = i; + while (j >= lo + h) { + int a = indx[j - h]; + int b = itmp; + int c = dv.getDataAt(a).compareTo(dv.getDataAt(b)); + if (decProfile.profile(dec)) { + if (!(c < 0 || (c == 0 && a > b))) { + break; + } + } else { + if (!(c > 0 || (c == 0 && a > b))) { + break; + } } + indx[j] = indx[j - h]; + j -= h; } - indx[j] = indx[j - h]; - j -= h; + indx[j] = itmp; } - indx[j] = itmp; } - } - } - - private int compareString(Collator collator, String dataAt, String dataAt2) { - if (needsStringCollation) { - return compare(collator, dataAt, dataAt2); } else { - return dataAt.compareToIgnoreCase(dataAt2); - } - } - - @TruffleBoundary - private static int compare(Collator collator, String dataAt, String dataAt2) { - return collator.compare(dataAt, dataAt2); - } + int length = dv.getLength(); + Collator baseCollator = Collator.getInstance(locale); + String rules = ((RuleBasedCollator) baseCollator).getRules(); + Collator collator; + try { + collator = new RuleBasedCollator(rules.replaceAll("<'\u005f'", "<' '<'\u005f'")); + } catch (ParseException e) { + throw RInternalError.shouldNotReachHere(e); + } + CollationKey[] entries = new CollationKey[length]; + for (int i = 0; i < length; i++) { + entries[i] = collator.getCollationKey(dv.getDataAt(i)); + } - @TruffleBoundary - private Collator createCollator() { - if (!needsStringCollation) { - return null; - } - // add rule for space before '_' - Collator collator = Collator.getInstance(); - String rules = ((RuleBasedCollator) collator).getRules(); - try { - return new RuleBasedCollator(rules.replaceAll("<'\u005f'", "<' '<'\u005f'")); - } catch (ParseException e) { - throw RInternalError.shouldNotReachHere(e); + for (int h = SINCS[t]; t < 16; h = SINCS[++t]) { + for (int i = lo + h; i <= hi; i++) { + int itmp = indx[i]; + int j = i; + while (j >= lo + h) { + int a = indx[j - h]; + int b = itmp; + int c = entries[a].compareTo(entries[b]); + if (decProfile.profile(dec)) { + if (!(c < 0 || (c == 0 && a > b))) { + break; + } + } else { + if (!(c > 0 || (c == 0 && a > b))) { + break; + } + } + indx[j] = indx[j - h]; + j -= h; + } + indx[j] = itmp; + } + } } } diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java index d9c48f7c886237a56d7b9b13298cbf3e4f14aa9a..15e8e71aa71ed38f06bcdfc9e3dc66a3d80f5bf1 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Rank.java @@ -52,8 +52,6 @@ public abstract class Rank extends RBuiltinNode.Arg3 { @Child private Order.CmpNode orderCmpNode; private final BranchProfile errorProfile = BranchProfile.create(); - private static final Object rho = new Object(); - private enum TiesKind { AVERAGE, MAX, @@ -76,7 +74,7 @@ public abstract class Rank extends RBuiltinNode.Arg3 { private Order.OrderVector1Node initOrderVector1() { if (orderVector1Node == null) { CompilerDirectives.transferToInterpreterAndInvalidate(); - orderVector1Node = insert(OrderVector1NodeGen.create(false)); + orderVector1Node = insert(OrderVector1NodeGen.create()); } return orderVector1Node; } @@ -112,7 +110,7 @@ public abstract class Rank extends RBuiltinNode.Arg3 { indx[i] = i; } RAbstractVector x = xa instanceof RAbstractLogicalVector ? xa.castSafe(RType.Integer, isNAProfile) : xa; - initOrderVector1().execute(indx, x, RRuntime.LOGICAL_TRUE, false, rho); + initOrderVector1().execute(indx, x, RRuntime.LOGICAL_TRUE, false, false); initOrderCmp(); int j; for (int i = 0; i < n; i = j + 1) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java index ec058295772e1fd4df8aa0c514bcf36fe3c7086f..407ce9faac3f31777368b02558b5ce92eb6a1b82 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/Round.java @@ -64,24 +64,27 @@ public abstract class Round extends RBuiltinNode.Arg2 { casts.arg("x").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(numericValue().or(complexValue())); // TODO: this should also accept vectors - // TODO: digits argument is rounded, not simply stripped off the decimal part - casts.arg("digits").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(numericValue().or(complexValue())).asIntegerVector().findFirst(); + casts.arg("digits").defaultError(RError.Message.NON_NUMERIC_MATH).mustBe(numericValue().or(complexValue())).asDoubleVector().findFirst(); + } + + protected static boolean isZero(double value) { + return value == 0; } @Specialization - protected double round(int x, @SuppressWarnings("unused") int digits) { + protected double round(int x, @SuppressWarnings("unused") double digits) { check.enable(x); return check.check(x) ? RRuntime.DOUBLE_NA : x; } @Specialization - protected double round(byte x, @SuppressWarnings("unused") int digits) { + protected double round(byte x, @SuppressWarnings("unused") double digits) { check.enable(x); return check.check(x) ? RRuntime.DOUBLE_NA : x; } @Specialization - protected RDoubleVector round(RAbstractLogicalVector x, @SuppressWarnings("unused") int digits) { + protected RDoubleVector round(RAbstractLogicalVector x, @SuppressWarnings("unused") double digits) { double[] data = new double[x.getLength()]; check.enable(x); for (int i = 0; i < data.length; i++) { @@ -92,7 +95,7 @@ public abstract class Round extends RBuiltinNode.Arg2 { } @Specialization - protected RDoubleVector round(RAbstractIntVector x, @SuppressWarnings("unused") int digits) { + protected RDoubleVector round(RAbstractIntVector x, @SuppressWarnings("unused") double digits) { double[] data = new double[x.getLength()]; check.enable(x); for (int i = 0; i < data.length; i++) { @@ -102,20 +105,24 @@ public abstract class Round extends RBuiltinNode.Arg2 { return RDataFactory.createDoubleVector(data, check.neverSeenNA()); } - @Specialization(guards = "digits == 0") - protected double round(double x, @SuppressWarnings("unused") int digits) { + @Specialization(guards = "isZero(digits)") + protected double round(double x, @SuppressWarnings("unused") double digits) { check.enable(x); return check.check(x) ? RRuntime.DOUBLE_NA : roundOp.op(x); } - @Specialization(guards = "digits != 0") protected double roundDigits(double x, int digits) { check.enable(x); return check.check(x) ? RRuntime.DOUBLE_NA : roundOp.opd(x, digits); } - @Specialization(guards = "digits == 0") - protected RDoubleVector round(RAbstractDoubleVector x, int digits) { + @Specialization(guards = "!isZero(digits)") + protected double roundDigits(double x, double digits) { + return roundDigits(x, (int) Math.round(digits)); + } + + @Specialization(guards = "isZero(digits)") + protected RDoubleVector round(RAbstractDoubleVector x, double digits) { double[] result = new double[x.getLength()]; check.enable(x); for (int i = 0; i < x.getLength(); i++) { @@ -127,9 +134,10 @@ public abstract class Round extends RBuiltinNode.Arg2 { return ret; } - @Specialization(guards = "digits != 0") - protected RDoubleVector roundDigits(RAbstractDoubleVector x, int digits) { + @Specialization(guards = "!isZero(dDigits)") + protected RDoubleVector roundDigits(RAbstractDoubleVector x, double dDigits) { double[] result = new double[x.getLength()]; + int digits = (int) Math.round(dDigits); check.enable(x); for (int i = 0; i < x.getLength(); i++) { double value = x.getDataAt(i); @@ -140,20 +148,24 @@ public abstract class Round extends RBuiltinNode.Arg2 { return ret; } - @Specialization(guards = "digits == 0") - protected RComplex round(RComplex x, @SuppressWarnings("unused") int digits) { + @Specialization(guards = "isZero(digits)") + protected RComplex round(RComplex x, @SuppressWarnings("unused") double digits) { check.enable(x); return check.check(x) ? RComplex.createNA() : RComplex.valueOf(roundOp.op(x.getRealPart()), roundOp.op(x.getImaginaryPart())); } - @Specialization(guards = "digits != 0") protected RComplex roundDigits(RComplex x, int digits) { check.enable(x); return check.check(x) ? RComplex.createNA() : roundOp.opd(x.getRealPart(), x.getImaginaryPart(), digits); } - @Specialization(guards = "digits == 0") - protected RComplexVector round(RAbstractComplexVector x, int digits) { + @Specialization(guards = "!isZero(digits)") + protected RComplex roundDigits(RComplex x, double digits) { + return roundDigits(x, (int) Math.round(digits)); + } + + @Specialization(guards = "isZero(digits)") + protected RComplexVector round(RAbstractComplexVector x, double digits) { double[] result = new double[x.getLength() << 1]; check.enable(x); for (int i = 0; i < x.getLength(); i++) { @@ -168,8 +180,9 @@ public abstract class Round extends RBuiltinNode.Arg2 { return ret; } - @Specialization(guards = "digits != 0") - protected RComplexVector roundDigits(RAbstractComplexVector x, int digits) { + @Specialization(guards = "!isZero(dDigits)") + protected RComplexVector roundDigits(RAbstractComplexVector x, double dDigits) { + int digits = (int) Math.round(dDigits); double[] result = new double[x.getLength() << 1]; check.enable(x); for (int i = 0; i < x.getLength(); i++) { diff --git a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java index 1a1e8590b42cc2ed94454809333400f1ef893a0b..b86ea1637eb4b486e0fe268acbe2ce7dde608e54 100644 --- a/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java +++ b/com.oracle.truffle.r.nodes.builtin/src/com/oracle/truffle/r/nodes/builtin/base/printer/DoubleVectorPrinter.java @@ -383,11 +383,11 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect private static final int DECIMAL_SHIFT = 350; private static final double[][] DECIMAL_VALUES = new double[700][10]; + private static final double[] DECIMAL_WEIGHTS = new double[700]; /** * This array contains the halves minus the unit of least precision, e.g. 0.499999... */ private static final double[] HALVES_MINUS_ULP = new double[700]; - private static final double[] DECIMAL_WEIGHTS = new double[700]; static { for (int i = 0; i < DECIMAL_WEIGHTS.length; i++) { @@ -395,9 +395,9 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect } for (int i = 0; i < DECIMAL_VALUES.length; i++) { for (int i2 = 0; i2 < 10; i2++) { - DECIMAL_VALUES[i][i2] = Math.pow(10, i - DECIMAL_SHIFT) * i2; + DECIMAL_VALUES[i][i2] = i2 / Math.pow(10, DECIMAL_SHIFT - i); } - HALVES_MINUS_ULP[i] = Double.longBitsToDouble(Double.doubleToLongBits(DECIMAL_VALUES[i][5]) - 1); + HALVES_MINUS_ULP[i] = Math.nextDown(DECIMAL_VALUES[i][5]); } } @@ -458,18 +458,8 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect for (int i = 0; i < blanks; i++) { str.append(' '); } - - double pow10 = DECIMAL_WEIGHTS[-log10 + d + DECIMAL_SHIFT]; - long mantissa = (long) (x * pow10); // round towards next digit instead of truncating - double rounded; - if ((mantissa & 1L) == 0) { - // even - rounded = x + HALVES_MINUS_ULP[log10 - d - 1 + DECIMAL_SHIFT]; - } else { - rounded = x + DECIMAL_VALUES[log10 - d - 1 + DECIMAL_SHIFT][5]; - } - + double rounded = x + DECIMAL_VALUES[log10 - d - 1 + DECIMAL_SHIFT][5]; if (Double.isFinite(rounded)) { x = rounded; // the rounding might have modified the exponent @@ -504,36 +494,55 @@ public final class DoubleVectorPrinter extends VectorPrinter<RAbstractDoubleVect str.append((char) ('0' + (log10 / 10))); str.append((char) ('0' + (log10 % 10))); } else { /* e == 0 */ - double pow10 = DECIMAL_WEIGHTS[d + DECIMAL_SHIFT]; - long mantissa = (long) (x * pow10); - // round towards next digit instead of truncating - if ((mantissa & 1L) == 0) { - // even - x += HALVES_MINUS_ULP[-d - 1 + DECIMAL_SHIFT]; - } else { - x += DECIMAL_VALUES[-d - 1 + DECIMAL_SHIFT][5]; - } - - int log10 = x == 0 ? 0 : Math.max((int) Math.log10(x), 0); - int blanks = w // target width - - (negated ? 1 : 0) // "-" - - (log10 + 1) // digits before "." - - (d > 0 ? 1 : 0) // "." - - d; // digits after "." + boolean finalRun = ((int) x) == x; // within int range is always exact + double startingX = x; + double halfOfLastDigit = DECIMAL_VALUES[-d - 1 + DECIMAL_SHIFT][5]; + while (true) { + if (!finalRun) { + double pow10 = x * DECIMAL_WEIGHTS[d + DECIMAL_SHIFT]; + double mantissa = Math.floor(pow10); + double rest = pow10 - mantissa; + + if (rest < 0.49 || rest > 0.99) { + // get the value away from the boundaries + x += halfOfLastDigit; + finalRun = true; + } + } + int log10 = x == 0 ? 0 : Math.max((int) Math.log10(x), 0); + int blanks = w // target width + - (negated ? 1 : 0) // "-" + - (log10 + 1) // digits before "." + - (d > 0 ? 1 : 0) // "." + - d; // digits after "." + + for (int i = 0; i < blanks; i++) { + str.append(' '); + } + if (negated) { + str.append('-'); + } + for (int i = log10; i >= 0; i--) { + x = appendDigit(x, i, str); + } + if (d > 0) { + str.append(cdec); + for (int i = 1; i <= d; i++) { + x = appendDigit(x, -i, str); + } + } + if (finalRun) { + break; + } - for (int i = 0; i < blanks; i++) { - str.append(' '); - } - if (negated) { - str.append('-'); - } - for (int i = log10; i >= 0; i--) { - x = appendDigit(x, i, str); - } - if (d > 0) { - str.append(cdec); - for (int i = 1; i <= d; i++) { - x = appendDigit(x, -i, str); + boolean even = ((str.charAt(str.length() - 1) - '0') & 1) == 0; + if (even ? x > halfOfLastDigit : x >= halfOfLastDigit) { + // the leftover is large enough to increment from rounding, so re-run + x = startingX + DECIMAL_VALUES[-d + DECIMAL_SHIFT][1]; + finalRun = true; + str.setLength(0); + } else { + break; } } } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java index c5c06f0b1ba25280ad228f8b70ee7c7fed3dc939..1300b879387a0e22c3a62a67a5908974d6fd7a69 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/REnvVars.java @@ -35,6 +35,7 @@ import java.security.CodeSource; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.TimeZone; import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.vm.PolyglotEngine; @@ -53,15 +54,14 @@ import com.oracle.truffle.r.runtime.ffi.BaseRFFI; */ public final class REnvVars implements RContext.ContextState { - private final Map<String, String> envVars = new HashMap<>(System.getenv()); + private final HashMap<String, String> envVars; - private REnvVars() { + private REnvVars(Map<String, String> initialEnvVars) { + envVars = new HashMap<>(initialEnvVars); } @Override public RContext.ContextState initialize(RContext context) { - // explicit environment settings in nested contexts must be installed first - checkExplicitEnvSettings(context); RCmdOptions cmdOptions = context.getCmdOptions(); // If running Rscript, R_DEFAULT_PACKAGES may need to be set String defaultPackages = cmdOptions.getString(RCmdOption.DEFAULT_PACKAGES); @@ -125,23 +125,8 @@ public final class REnvVars implements RContext.ContextState { return this; } - public static REnvVars newContextState() { - return new REnvVars(); - } - - private void checkExplicitEnvSettings(RContext context) { - String[] envs = context.getEnvSettings(); - if (envs == null || envs.length == 0) { - return; - } - for (String envdef : envs) { - String[] parts = envdef.split("="); - if (parts.length == 2) { - envVars.put(parts[0], parts[1]); - } else { - // for now just ignore - } - } + public static REnvVars newContextState(Map<String, String> initialEnvVars) { + return new REnvVars(initialEnvVars); } private String getEitherCase(String var) { @@ -290,6 +275,14 @@ public final class REnvVars implements RContext.ContextState { } } + public TimeZone getSystemTimeZone() { + String tzName = envVars.get("TZ"); + if (tzName != null) { + return TimeZone.getTimeZone(tzName); + } + return TimeZone.getDefault(); + } + private String expandParameters(String value) { StringBuilder result = new StringBuilder(); int x = 0; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java index 4180cd6a52c985c5f926a7c3a4090693052994a6..e8d02437ed8c0daafd4218cd9015ecf3e6356e73 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RError.java @@ -903,6 +903,7 @@ public final class RError extends RuntimeException implements TruffleException { FILE_NOT_FOUND_IN_ZIP("requested file not found in the zip file"), LIST_NO_VALID_NAMES("list argument has no valid names"), VALUES_MUST_BE_LENGTH("values must be length %s,\n but FUN(X[[%d]]) result is length %s"), + OS_REQUEST_LOCALE("OS reports request to set locale to \"%s\" cannot be honored"), INVALID_TYPE("invalid type (%s) for '%s' (must be a %s)"); public final String message; diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java index 5b78bfd0da8f665ad8d75373985864007a377ff5..fd95e657f4337607f7886cb8b8635c29516d3793 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RErrorHandling.java @@ -767,7 +767,7 @@ public class RErrorHandling { // (is 74 a given percentage of console width?) if (preamble.length() + 1 + message.length() >= 74) { // +1 is for the extra space following the colon - return preamble + " \n " + message; + return preamble + "\n " + message; } else { return preamble + " " + message; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RLocale.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RLocale.java new file mode 100644 index 0000000000000000000000000000000000000000..ca3c2f2891a3037cdfdce93a036c7815f916b491 --- /dev/null +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/RLocale.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.oracle.truffle.r.runtime; + +import java.nio.charset.Charset; +import java.nio.charset.IllegalCharsetNameException; +import java.nio.charset.StandardCharsets; +import java.nio.charset.UnsupportedCharsetException; +import java.util.EnumMap; +import java.util.Locale; + +import com.oracle.truffle.r.runtime.RError.Message; +import com.oracle.truffle.r.runtime.context.RContext; +import com.oracle.truffle.r.runtime.context.RContext.ContextState; + +public enum RLocale { + COLLATE(true, true, true), + CTYPE(false, true, true), + MONETARY(true, true, true), + NUMERIC(true, false, true), + TIME(true, true, true), + MESSAGES(true, true, true), + PAPER(false, false, false), + MEASUREMENT(false, false, false); + + private final String name; + private final boolean needsLocale; + private final boolean initializedAtStartup; + private final boolean listed; + + RLocale(boolean needsLocale, boolean initializedAtStartup, boolean listed) { + this.needsLocale = needsLocale; + this.initializedAtStartup = initializedAtStartup; + this.listed = listed; + this.name = "LC_" + name(); + } + + public static final class ContextStateImpl implements RContext.ContextState { + private final EnumMap<RLocale, Locale> locales = new EnumMap<>(RLocale.class); + private final EnumMap<RLocale, Charset> charsets = new EnumMap<>(RLocale.class); + + private ContextStateImpl() { + // private constructor + } + + private static String getDefinition(String name, REnvVars envVars) { + // lookup order: LC_ALL, LC_<name>, LANG + for (String identifier : new String[]{"LC_ALL", name, "LANG"}) { + String value = envVars.get(identifier); + if (value != null && !value.isEmpty()) { + return value; + } + } + return null; + } + + @Override + public ContextState initialize(RContext context) { + REnvVars envVars = context.stateREnvVars; + for (RLocale locale : RLocale.values()) { + if (locale.initializedAtStartup) { + setLocale(locale, getDefinition(locale.name, envVars), true); + } else { + setLocale(locale, "C", true); + } + } + return this; + } + + private static Charset getCharset(String value) { + try { + int dot = value.indexOf('.'); + return dot == -1 ? Charset.forName(value) : Charset.forName(value.substring(dot + 1)); + } catch (UnsupportedCharsetException | IllegalCharsetNameException e) { + return null; + } + } + + private static Locale getLocale(String value) { + int dot = value.indexOf('.'); + String code = dot == -1 ? value : value.substring(0, dot); + Locale.Builder builder = new Locale.Builder(); + switch (code.length()) { + case 2: + return builder.setLanguage(code).build(); + case 5: + if (code.charAt(2) == '_') { + return builder.setLanguage(code.substring(0, 2)).setRegion(code.substring(3)).build(); + } + break; + default: + if (code.length() >= 7 && code.charAt(2) == '_' && code.charAt(5) == '_') { + return builder.setLanguage(code.substring(0, 2)).setRegion(code.substring(3)).setVariant(code.substring(6)).build(); + } + break; + } + return null; + } + + public void setLocale(RLocale locale, String value) { + setLocale(locale, value, false); + } + + public void setLocale(RLocale locale, String value, boolean startup) { + Charset c = null; + Locale l = null; + if ("C".equals(value) || "POSIX".equals(value)) { + c = StandardCharsets.US_ASCII; + } else if (value != null) { + c = getCharset(value); + l = getLocale(value); + if ((c == null && l == null) || (l == null && locale.needsLocale)) { + if (startup) { + RContext.getInstance().getConsole().printErrorln("Setting " + locale.name + " failed, using default"); + } else { + RError.warning(RError.SHOW_CALLER, Message.OS_REQUEST_LOCALE, value); + } + } + } + charsets.put(locale, c == null ? StandardCharsets.UTF_8 : c); + locales.put(locale, l == null ? Locale.ROOT : l); + } + + public Charset getCharset(RLocale locale) { + return charsets.get(locale); + } + + public Locale getLocale(RLocale locale) { + return locales.get(locale); + } + + public static ContextStateImpl newContextState() { + return new ContextStateImpl(); + } + } + + public String getRepresentation(RContext context) { + ContextStateImpl state = context.stateRLocale; + Locale l = state.locales.get(this); + Charset c = state.charsets.get(this); + if (c == StandardCharsets.US_ASCII) { + if (l == Locale.ROOT) { + return "C"; + } else { + return l.toString(); + } + } else { + if (l == Locale.ROOT) { + return c.name(); + } else { + return l.toString() + "." + c.name(); + } + } + } + + public boolean isListed() { + return listed; + } +} diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java index 5dc6ed526481acc3228f4795854c88f5fa73af48..7f887376309f6383d770b73bcbbbeab0277b5438 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/Utils.java @@ -475,7 +475,17 @@ public final class Utils { // Truffle/R system has started return null; } - return RArguments.unwrap(frameInstance.getFrame(FrameAccess.MATERIALIZE)); + Frame frame = RArguments.unwrap(frameInstance.getFrame(FrameAccess.MATERIALIZE)); + if (!RArguments.isRFrame(frame)) { + return Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<Frame>() { + @Override + public Frame visitFrame(FrameInstance instance) { + Frame current = RArguments.unwrap(instance.getFrame(FrameAccess.MATERIALIZE)); + return RArguments.isRFrame(current) ? current : null; + } + }); + } + return frame; } private static final class TracebackVisitor implements FrameInstanceVisitor<Frame> { diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java index 851519c9ca49d7f9927a5ab9195e76ce8675e66b..ea6a5e4b639760dee73ee1dda69aa626b3d891bb 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/DelegateRConnection.java @@ -119,8 +119,10 @@ abstract class DelegateRConnection extends RObject implements RConnection, ByteC if (!isSeekable()) { throw RError.error(RError.SHOW_CALLER, RError.Message.NOT_ENABLED_FOR_THIS_CONN, "seek"); } - final long res = seekInternal(offset, seekMode, seekRWMode); - invalidateCache(); + long res = seekInternal(offset, seekMode, seekRWMode); + if (seekMode != SeekMode.ENQUIRE) { + invalidateCache(); + } return res; } @@ -350,8 +352,8 @@ abstract class DelegateRConnection extends RObject implements RConnection, ByteC * <it>Standard</it> means that there is a shared cursor between reading and writing operations. * </p> */ - public static long seek(SeekableByteChannel channel, long offset, SeekMode seekMode, @SuppressWarnings("unused") SeekRWMode seekRWMode) throws IOException { - long position = channel.position(); + public static long seek(SeekableByteChannel channel, long offset, SeekMode seekMode, @SuppressWarnings("unused") SeekRWMode seekRWMode, int bytesInCache) throws IOException { + long position = channel.position() - bytesInCache; switch (seekMode) { case ENQUIRE: break; @@ -601,6 +603,10 @@ abstract class DelegateRConnection extends RObject implements RConnection, ByteC } } + protected int bytesInCache() { + return cache.remaining(); + } + @Override public OutputStream getOutputStream() throws IOException { return Channels.newOutputStream(this); diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java index d7b01f19cd0c90c3661f8388e1a2937d64a062c5..7ff189d0fa6fac2e3b4329be7b9817bd15023b8b 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/conn/FileConnections.java @@ -280,7 +280,7 @@ public class FileConnections { @Override public long seekInternal(long offset, SeekMode seekMode, SeekRWMode seekRWMode) throws IOException { - return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode); + return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode, bytesInCache()); } @Override @@ -342,7 +342,7 @@ public class FileConnections { @Override protected long seekInternal(long offset, SeekMode seekMode, SeekRWMode seekRWMode) throws IOException { - return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode); + return DelegateRConnection.seek(channel, offset, seekMode, seekRWMode, bytesInCache()); } @Override diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java index bdcd6c61d363601afc703ff79f0609aa8fd7202d..a40ce96e9b708b299c5697038600e8ca607a74ae 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/ChildContextInfo.java @@ -25,7 +25,7 @@ package com.oracle.truffle.r.runtime.context; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.util.TimeZone; +import java.util.Map; import java.util.concurrent.Executor; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; @@ -34,8 +34,8 @@ import com.oracle.truffle.api.TruffleContext; import com.oracle.truffle.api.vm.PolyglotEngine; import com.oracle.truffle.api.vm.PolyglotEngine.Builder; import com.oracle.truffle.r.launcher.RCmdOptions; -import com.oracle.truffle.r.launcher.RStartParams; import com.oracle.truffle.r.launcher.RCmdOptions.Client; +import com.oracle.truffle.r.launcher.RStartParams; import com.oracle.truffle.r.runtime.RInternalError; import com.oracle.truffle.r.runtime.context.RContext.ContextKind; @@ -71,9 +71,8 @@ public final class ChildContextInfo { static final AtomicInteger multiSlotInds = new AtomicInteger(-1); private final RStartParams startParams; - private final String[] env; + private final Map<String, String> env; private final RContext.ContextKind kind; - private final TimeZone systemTimeZone; /** * Any context created by another has a parent. When such a context is destroyed we must reset @@ -89,7 +88,8 @@ public final class ChildContextInfo { private PolyglotEngine vm; public Executor executor; - private ChildContextInfo(RStartParams startParams, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr, TimeZone systemTimeZone, int id, + private ChildContextInfo(RStartParams startParams, Map<String, String> env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr, + int id, int multiSlotInd) { this.startParams = startParams; this.env = env; @@ -98,7 +98,6 @@ public final class ChildContextInfo { this.stdin = stdin; this.stdout = stdout; this.stderr = stderr; - this.systemTimeZone = systemTimeZone; this.multiSlotInd = multiSlotInd; this.id = id; } @@ -149,10 +148,8 @@ public final class ChildContextInfo { * @param kind defines the degree to which this context shares base and package environments * with its parent * @param parent if non-null {@code null}, the parent creating the context - * @param systemTimeZone the system's time zone */ - public static ChildContextInfo create(RStartParams startParams, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr, - TimeZone systemTimeZone) { + public static ChildContextInfo create(RStartParams startParams, Map<String, String> env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) { int id = contextInfoIds.incrementAndGet(); int multiSlotInd = multiSlotInds.get(); if (kind == ContextKind.SHARE_ALL || kind == ContextKind.SHARE_NOTHING) { @@ -164,23 +161,18 @@ public final class ChildContextInfo { throw RInternalError.shouldNotReachHere(); } assert kind != ContextKind.SHARE_PARENT_RW || (kind == ContextKind.SHARE_PARENT_RW && parent.getKind() == ContextKind.SHARE_NOTHING && parent.getMultiSlotInd() == 0); - return new ChildContextInfo(startParams, env, kind, parent, stdin, stdout, stderr, systemTimeZone, id, kind == ContextKind.SHARE_PARENT_RW ? 0 : multiSlotInd); - } - - public static ChildContextInfo create(RStartParams startParams, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) { - return create(startParams, env, kind, parent, stdin, stdout, stderr, TimeZone.getDefault()); + return new ChildContextInfo(startParams, env, kind, parent, stdin, stdout, stderr, id, kind == ContextKind.SHARE_PARENT_RW ? 0 : multiSlotInd); } /** * Create a context configuration object such that FastR does not restore previously stored * sessions on startup. * - * @param env TODO * @param kind defines the degree to which this context shares base and package environments * with its parent * @param parent if non-null {@code null}, the parent creating the context */ - public static ChildContextInfo createNoRestore(Client client, String[] env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) { + public static ChildContextInfo createNoRestore(Client client, Map<String, String> env, ContextKind kind, RContext parent, InputStream stdin, OutputStream stdout, OutputStream stderr) { RStartParams params = new RStartParams(RCmdOptions.parseArguments(client, new String[]{"R", "--vanilla", "--slave", "--silent", "--no-restore"}, false), false); return create(params, env, kind, parent, stdin, stdout, stderr); } @@ -189,7 +181,7 @@ public final class ChildContextInfo { return startParams; } - public String[] getEnv() { + public Map<String, String> getEnv() { return env; } @@ -201,10 +193,6 @@ public final class ChildContextInfo { return parent; } - public TimeZone getSystemTimeZone() { - return systemTimeZone; - } - public int getId() { return id; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java index 41383f5865d7d2582a433d352298175b523f18bd..c20435b25add40eb7965dd44a5b16fb917ddfdfe 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/context/RContext.java @@ -40,11 +40,11 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TimeZone; import java.util.WeakHashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; @@ -80,6 +80,7 @@ import com.oracle.truffle.r.runtime.RError; import com.oracle.truffle.r.runtime.RErrorHandling; import com.oracle.truffle.r.runtime.RInternalCode.ContextStateImpl; import com.oracle.truffle.r.runtime.RInternalError; +import com.oracle.truffle.r.runtime.RLocale; import com.oracle.truffle.r.runtime.ROptions; import com.oracle.truffle.r.runtime.RProfile; import com.oracle.truffle.r.runtime.RRuntime; @@ -226,9 +227,7 @@ public final class RContext implements RTruffleObject { private final RStartParams startParameters; private final RCmdOptions cmdOptions; - private final String[] environment; private final RContext.ContextKind contextKind; - private final TimeZone systemTimeZone; public final Map<Class<?>, RootCallTarget> nativeCallTargets = new HashMap<>(); public RootCallTarget getOrCreateNativeCallTarget(Class<?> clazz, Supplier<RootCallTarget> creatFunction) { @@ -332,6 +331,7 @@ public final class RContext implements RTruffleObject { * processor, but the set is relatively small, so we just enumerate them here. */ public final REnvVars stateREnvVars; + public final RLocale.ContextStateImpl stateRLocale; public final TempPathName stateTempPath; public final RProfile stateRProfile; public final StdConnections.ContextStateImpl stateStdConnections; @@ -357,7 +357,8 @@ public final class RContext implements RTruffleObject { private final AllocationReporter allocationReporter; private ContextState[] contextStates() { - return new ContextState[]{stateREnvVars, stateRProfile, stateTempPath, stateROptions, stateREnvironment, stateRErrorHandling, stateRConnection, stateStdConnections, stateRNG, stateRFFI, + return new ContextState[]{stateREnvVars, stateRLocale, stateRProfile, stateTempPath, stateROptions, stateREnvironment, stateRErrorHandling, stateRConnection, stateStdConnections, stateRNG, + stateRFFI, stateRSerialize, stateLazyDBCache, stateInstrumentation, stateDLL}; } @@ -386,35 +387,33 @@ public final class RContext implements RTruffleObject { } Object initialInfo = env.getConfig().get(ChildContextInfo.CONFIG_KEY); + Map<String, String> initialEnvVars; if (initialInfo == null) { /* * This implies that FastR is being invoked initially from another Truffle language or - * via RCommand/RscriptCommand. TODO How to deciden if session state is to be restored - * stored session should be restored. + * via RCommand/RscriptCommand. TODO How to decide if session state is to be restored */ this.cmdOptions = RCmdOptions.parseArguments(Client.R, args, true); this.startParameters = new RStartParams(cmdOptions, false); - this.environment = null; this.contextKind = ContextKind.SHARE_NOTHING; - this.systemTimeZone = TimeZone.getDefault(); this.parentContext = null; this.id = ChildContextInfo.contextInfoIds.incrementAndGet(); this.multiSlotIndex = 0; - this.truffleContext = null; // TODO + this.truffleContext = null; this.executor = null; + initialEnvVars = System.getenv(); } else { // child spawned explicitly by R ChildContextInfo info = (ChildContextInfo) initialInfo; this.cmdOptions = RCmdOptions.parseArguments(Client.R, args, true); this.startParameters = info.getStartParams(); - this.environment = info.getEnv(); this.contextKind = info.getKind(); - this.systemTimeZone = info.getSystemTimeZone(); this.parentContext = info.getParent(); this.id = info.getId(); this.multiSlotIndex = info.getMultiSlotInd(); this.truffleContext = info.getTruffleContext(); this.executor = info.executor; + initialEnvVars = info.getEnv() == null ? Collections.emptyMap() : info.getEnv(); } outputWelcomeMessage(startParameters); @@ -425,7 +424,8 @@ public final class RContext implements RTruffleObject { this.initial = isInitial; this.env = env; - this.stateREnvVars = REnvVars.newContextState(); + this.stateREnvVars = REnvVars.newContextState(initialEnvVars); + this.stateRLocale = RLocale.ContextStateImpl.newContextState(); this.stateTempPath = TempPathName.newContextState(); this.stateROptions = ROptions.ContextStateImpl.newContextState(stateREnvVars); this.stateRProfile = RProfile.newContextState(stateREnvVars); @@ -502,6 +502,7 @@ public final class RContext implements RTruffleObject { doEnvOptionsProfileInitialization(); } + stateRLocale.initialize(this); stateREnvironment.initialize(this); stateRErrorHandling.initialize(this); stateRConnection.initialize(this); @@ -730,10 +731,6 @@ public final class RContext implements RTruffleObject { return startParameters; } - public String[] getEnvSettings() { - return environment; - } - public boolean hasExecutor() { return executor != null; } @@ -790,10 +787,6 @@ public final class RContext implements RTruffleObject { return loadingBase; } - public TimeZone getSystemTimeZone() { - return systemTimeZone; - } - public String getNamespaceName() { return nameSpaceName; } diff --git a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java index 8178d4c0276ae70944915079cd7754463b8c30b2..bd79d8d202587cb25d2552d0c60ec6e3312779a5 100644 --- a/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java +++ b/com.oracle.truffle.r.runtime/src/com/oracle/truffle/r/runtime/data/CharSXPWrapper.java @@ -22,6 +22,8 @@ */ package com.oracle.truffle.r.runtime.data; +import com.oracle.truffle.r.runtime.RRuntime; + /** * Internally GNU R distinguishes "strings" and "vectors of strings" using the {@code CHARSXP} and * {@code STRSXP} types, respectively. Although this difference is invisible at the R level, it @@ -32,6 +34,8 @@ package com.oracle.truffle.r.runtime.data; * N.B. Use limited to RFFI implementations. */ public final class CharSXPWrapper extends RObject implements RTruffleObject { + private static final CharSXPWrapper NA = new CharSXPWrapper(RRuntime.STRING_NA); + private String contents; private CharSXPWrapper(String contents) { @@ -48,7 +52,11 @@ public final class CharSXPWrapper extends RObject implements RTruffleObject { } public static CharSXPWrapper create(String contents) { - return new CharSXPWrapper(contents); + if (contents == RRuntime.STRING_NA) { + return NA; + } else { + return new CharSXPWrapper(contents); + } } public long allocateNativeContents() { diff --git a/com.oracle.truffle.r.test.packages/gated b/com.oracle.truffle.r.test.packages/gated new file mode 100644 index 0000000000000000000000000000000000000000..f2bc110186ab1197be4bc81b8e2f610e4beebb18 --- /dev/null +++ b/com.oracle.truffle.r.test.packages/gated @@ -0,0 +1 @@ +foreign diff --git a/com.oracle.truffle.r.test.packages/r/install.packages.R b/com.oracle.truffle.r.test.packages/r/install.packages.R index 95736d4761ccd59263a8e2513862d071e7fce6e8..799db01552808fbf92145817ac5b225c2240e23c 100644 --- a/com.oracle.truffle.r.test.packages/r/install.packages.R +++ b/com.oracle.truffle.r.test.packages/r/install.packages.R @@ -45,7 +45,7 @@ # A list of repos can be provided with the --repos argument, which ia comma separated string of name=value pairs. # The names "CRAN", "BIOC" and "FASTR" are understood and have default values. # By default, we use the CRAN mirror specified in the --repos argument or env var CRAN_MIRROR. -# The default value for --repos is "CRAN=http://cran.cnr.berkeley.edu" +# The default value for --repos is "CRAN=http://cloud.r-project.org/" # Packages are installed into the directory specified by the --lib arg (or R_LIBS_USER env var) @@ -279,7 +279,7 @@ set.repos <- function() { } else if (name == "CRAN") { if (is.na(uri)) { # not set on command line - cran.mirror <<- Sys.getenv("CRAN_MIRROR", unset = "http://cran.cnr.berkeley.edu/") + cran.mirror <<- Sys.getenv("CRAN_MIRROR", unset = "http://cloud.r-project.org/") } else { cran.mirror <- uri } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test index fa331b0089c5f671ce54f0bc0945df6b229f5505..06d54805ff27dfbfbc043ccfef202f211626b0d3 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/ExpectedTestOutput.test @@ -642,11 +642,11 @@ Error: no slot of name "foo" for this object of class "classRepresentation" #{ getClass("ClassUnionRepresentation")@virtual } [1] FALSE -##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.ImplementationError# +##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.SideEffects# #{ setClass("foo", contains="numeric"); x<-new("foo"); res<-slot(x, ".Data"); removeClass("foo"); res } numeric(0) -##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.ImplementationError# +##com.oracle.truffle.r.test.S4.TestS4.testSlotAccess#Ignored.SideEffects# #{ setClass("foo", contains="numeric"); x<-new("foo"); res<-x@.Data; removeClass("foo"); res } numeric(0) @@ -1269,7 +1269,7 @@ $vectors NULL -##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa4#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa4# #argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]])) $d [1] 2.000000 1.732051 1.414214 1.000000 @@ -1327,7 +1327,7 @@ $vt #argv <- list(structure(c(1, 1, 3, 3), .Dim = c(2L, 2L)), 'O'); .Internal(La_dgecon(argv[[1]], argv[[2]])) [1] 0 -##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa8#Ignored.Unimplemented# +##com.oracle.truffle.r.test.builtins.TestBuiltin_La.testLa8# #argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]])) $d [1] 8.164129e+03 4.572450e+02 3.245844e+02 1.343122e+02 4.955532e+00 @@ -7417,7 +7417,7 @@ In matrix(1:4, 3, 2) : [2,] 3 4 [3,] 5 6 -##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#Ignored.ReferenceError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix# #{ matrix(1i,10,10) } [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i @@ -7503,7 +7503,7 @@ In matrix(c(1, 2, 3, 4), 3, 2) : [9,] 0+ 1i 0+ 1i 0+ 1i 0+ 1i 0+ 1i 0+ 1i 0+ 1i 0+ 1i 0+ 1i 0+ 1i [10,] 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i 0+100i -##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix#Ignored.ReferenceError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_asmatrix.testMatrix# #{ matrix(c(1i,NA),10,10) } [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [1,] 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i 0+1i @@ -22762,7 +22762,7 @@ FALSE #argv <- list(c(0.00508571428571428, 0.876285714285715), structure(1L, class = c('terminal', 'connection')), 69); .Internal(dput(argv[[1]], argv[[2]], argv[[3]])) c(0.00508571428571428, 0.876285714285715) -##com.oracle.truffle.r.test.builtins.TestBuiltin_dqr.testdqrcf#Ignored.OutputFormatting# +##com.oracle.truffle.r.test.builtins.TestBuiltin_dqr.testdqrcf# #.Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L) [[1]] [1] 1 @@ -23346,60 +23346,1444 @@ character(0) [1] NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 0, quote = "", justify = "centre");} -[1] "a" "ab" "abcde" "<NA>" +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='c', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='c', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='l', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='l', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='n', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='n', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='r', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='"', justify='r', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='c', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='c', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='l', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='l', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='n', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='n', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='r', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='\'', justify='r', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='c', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='c', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='l', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='l', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='n', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='n', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='r', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote='a', justify='r', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='c', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='c', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='l', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='l', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='n', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='n', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='r', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 0, quote=, justify='r', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='c', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='c', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='l', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='l', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='n', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='n', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='r', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='"', justify='r', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='c', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='c', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='l', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='l', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='n', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='n', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='r', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='\'', justify='r', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='c', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='c', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='l', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='l', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='n', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='n', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='r', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote='a', justify='r', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='c', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='c', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='l', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='l', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='n', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='n', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='r', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 1, quote=, justify='r', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='c', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='c', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA " "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='l', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='l', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA " "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='n', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='n', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='r', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='"', justify='r', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] " NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='c', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='c', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA " "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='l', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='l', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA " "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='n', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='n', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='r', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='\'', justify='r', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] " NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='c', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='c', na=T) +[1] "aaa" "aaba" "aabcdea" "NA " +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='l', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='l', na=T) +[1] "aaa" "aaba" "aabcdea" "NA " +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='n', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='n', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='r', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote='a', justify='r', na=T) +[1] "aaa" "aaba" "aabcdea" " NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='c', na=F) +[1] " a " "ab " "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='c', na=T) +[1] " a " "ab " "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='l', na=F) +[1] "a " "ab " "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='l', na=T) +[1] "a " "ab " "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='n', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='n', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='r', na=F) +[1] " a" " ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 3, quote=, justify='r', na=T) +[1] " a" " ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='c', na=F) +[1] " \"a\" " " \"ab\" " "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='c', na=T) +[1] " \"a\" " " \"ab\" " "\"abcde\"" +[4] " NA " "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='l', na=F) +[1] "\"a\" " "\"ab\" " "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='l', na=T) +[1] "\"a\" " "\"ab\" " "\"abcde\"" +[4] "NA " "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='n', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='n', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='r', na=F) +[1] " \"a\"" " \"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='"', justify='r', na=T) +[1] " \"a\"" " \"ab\"" "\"abcde\"" +[4] " NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='c', na=F) +[1] " 'a' " " 'ab' " "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='c', na=T) +[1] " 'a' " " 'ab' " "'abcde'" +[4] " NA " "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='l', na=F) +[1] "'a' " "'ab' " "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='l', na=T) +[1] "'a' " "'ab' " "'abcde'" +[4] "NA " "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='n', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='n', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='r', na=F) +[1] " 'a'" " 'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='\'', justify='r', na=T) +[1] " 'a'" " 'ab'" "'abcde'" +[4] " NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='c', na=F) +[1] " aaa " " aaba " "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='c', na=T) +[1] " aaa " " aaba " "aabcdea" " NA " +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='l', na=F) +[1] "aaa " "aaba " "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='l', na=T) +[1] "aaa " "aaba " "aabcdea" "NA " +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='n', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='n', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='r', na=F) +[1] " aaa" " aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote='a', justify='r', na=T) +[1] " aaa" " aaba" "aabcdea" " NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='c', na=F) +[1] " a " " ab " " abcde " NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='c', na=T) +[1] " a " " ab " " abcde " " <NA> " +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='l', na=F) +[1] "a " "ab " "abcde " NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='l', na=T) +[1] "a " "ab " "abcde " "<NA> " +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='n', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='n', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='r', na=F) +[1] " a" " ab" " abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = 7, quote=, justify='r', na=T) +[1] " a" " ab" " abcde" " <NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='c', na=F) +[1] " \"a\" " " \"ab\" " " \"abcde\" " +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='c', na=T) +[1] " \"a\" " " \"ab\" " " \"abcde\" " +[4] " NA " "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='l', na=F) +[1] "\"a\" " "\"ab\" " "\"abcde\" " +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='l', na=T) +[1] "\"a\" " "\"ab\" " "\"abcde\" " +[4] "NA " "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='n', na=F) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='n', na=T) +[1] "\"a\"" "\"ab\"" "\"abcde\"" +[4] "NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='r', na=F) +[1] " \"a\"" " \"ab\"" " \"abcde\"" +[4] NA "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='"', justify='r', na=T) +[1] " \"a\"" " \"ab\"" " \"abcde\"" +[4] " NA" "\"\\t\\nሴfoo\\\"'\"" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='c', na=F) +[1] " 'a' " " 'ab' " " 'abcde' " +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='c', na=T) +[1] " 'a' " " 'ab' " " 'abcde' " +[4] " NA " "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='l', na=F) +[1] "'a' " "'ab' " "'abcde' " +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='l', na=T) +[1] "'a' " "'ab' " "'abcde' " +[4] "NA " "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='n', na=F) +[1] "'a'" "'ab'" "'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='n', na=T) +[1] "'a'" "'ab'" "'abcde'" +[4] "NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='r', na=F) +[1] " 'a'" " 'ab'" " 'abcde'" +[4] NA "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='\'', justify='r', na=T) +[1] " 'a'" " 'ab'" " 'abcde'" +[4] " NA" "'\\t\\nሴfoo\"\\''" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='c', na=F) +[1] " aaa " " aaba " " aabcdea " NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='c', na=T) +[1] " aaa " " aaba " " aabcdea " " NA " +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='l', na=F) +[1] "aaa " "aaba " "aabcdea " NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='l', na=T) +[1] "aaa " "aaba " "aabcdea " "NA " +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='n', na=F) +[1] "aaa" "aaba" "aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='n', na=T) +[1] "aaa" "aaba" "aabcdea" "NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='r', na=F) +[1] " aaa" " aaba" " aabcdea" NA +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote='a', justify='r', na=T) +[1] " aaa" " aaba" " aabcdea" " NA" +[5] "a\\t\\nሴfoo\"'a" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='c', na=F) +[1] " a " " ab " " abcde " NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='c', na=T) +[1] " a " " ab " " abcde " " <NA> " +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='l', na=F) +[1] "a " "ab " "abcde " NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='l', na=T) +[1] "a " "ab " "abcde " "<NA> " +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='n', na=F) +[1] "a" "ab" "abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='n', na=T) +[1] "a" "ab" "abcde" "<NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='r', na=F) +[1] " a" " ab" " abcde" NA +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a','ab','abcde',NA,'\t\n\u1234foo\"\''), width = NA, quote=, justify='r', na=T) +[1] " a" " ab" " abcde" " <NA>" +[5] "\\t\\nሴfoo\"'" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='c', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='c', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='l', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='l', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='n', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='n', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='r', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='"', justify='r', na=T) +[1] "\"a\"" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 0, quote = "'", justify = "right");} -[1] "'a'" "'ab'" "'abcde'" "NA" +#encodeString(c('a',NA), width = 0, quote='\'', justify='c', na=F) +[1] "'a'" NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 0, quote = "'", na.encode=FALSE, justify = "right");} -[1] "'a'" "'ab'" "'abcde'" NA +#encodeString(c('a',NA), width = 0, quote='\'', justify='c', na=T) +[1] "'a'" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 2, quote = "'", na.encode=FALSE, justify = "centre");} -[1] "'a'" "'ab'" "'abcde'" NA +#encodeString(c('a',NA), width = 0, quote='\'', justify='l', na=F) +[1] "'a'" NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 3, quote = "", na.encode=TRUE, justify = "centre");} -[1] " a " "ab " "abcde" "<NA>" +#encodeString(c('a',NA), width = 0, quote='\'', justify='l', na=T) +[1] "'a'" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 3, quote = "'", justify = "centre");} -[1] "'a'" "'ab'" "'abcde'" "NA " +#encodeString(c('a',NA), width = 0, quote='\'', justify='n', na=F) +[1] "'a'" NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 3, quote = "'", na.encode=FALSE, justify = "centre");} -[1] "'a'" "'ab'" "'abcde'" NA +#encodeString(c('a',NA), width = 0, quote='\'', justify='n', na=T) +[1] "'a'" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 7, quote = "", na.encode=FALSE, justify = "centre");} -[1] " a " " ab " " abcde " NA +#encodeString(c('a',NA), width = 0, quote='\'', justify='r', na=F) +[1] "'a'" NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = 7, quote = "", na.encode=TRUE, justify = "centre");} -[1] " a " " ab " " abcde " " <NA> " +#encodeString(c('a',NA), width = 0, quote='\'', justify='r', na=T) +[1] "'a'" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA);} -[1] "a " "ab " "abcde" "<NA> " +#encodeString(c('a',NA), width = 0, quote='a', justify='c', na=F) +[1] "aaa" NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, justify = "centre");} -[1] " a " " ab " "abcde" "<NA> " +#encodeString(c('a',NA), width = 0, quote='a', justify='c', na=T) +[1] "aaa" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, justify = "right");} -[1] " a" " ab" "abcde" " <NA>" +#encodeString(c('a',NA), width = 0, quote='a', justify='l', na=F) +[1] "aaa" NA ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, quote = "'", justify = "right");} -[1] " 'a'" " 'ab'" "'abcde'" " NA" +#encodeString(c('a',NA), width = 0, quote='a', justify='l', na=T) +[1] "aaa" "NA" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# -#{x <- c("a", "ab", "abcde", NA); encodeString(x, width = NA, quote = "'", na.encode=FALSE, justify = "right");} -[1] " 'a'" " 'ab'" "'abcde'" NA +#encodeString(c('a',NA), width = 0, quote='a', justify='n', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='a', justify='n', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='a', justify='r', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote='a', justify='r', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='c', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='c', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='l', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='l', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='n', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='n', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='r', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 0, quote=, justify='r', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='c', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='c', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='l', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='l', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='n', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='n', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='r', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='"', justify='r', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='c', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='c', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='l', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='l', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='n', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='n', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='r', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='\'', justify='r', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='c', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='c', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='l', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='l', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='n', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='n', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='r', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote='a', justify='r', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='c', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='c', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='l', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='l', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='n', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='n', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='r', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 1, quote=, justify='r', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='c', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='c', na=T) +[1] "\"a\"" "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='l', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='l', na=T) +[1] "\"a\"" "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='n', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='n', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='r', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='"', justify='r', na=T) +[1] "\"a\"" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='c', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='c', na=T) +[1] "'a'" "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='l', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='l', na=T) +[1] "'a'" "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='n', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='n', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='r', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='\'', justify='r', na=T) +[1] "'a'" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='c', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='c', na=T) +[1] "aaa" "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='l', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='l', na=T) +[1] "aaa" "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='n', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='n', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='r', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote='a', justify='r', na=T) +[1] "aaa" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='c', na=F) +[1] " a " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='c', na=T) +[1] " a " "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='l', na=F) +[1] "a " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='l', na=T) +[1] "a " "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='n', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='n', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='r', na=F) +[1] " a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 3, quote=, justify='r', na=T) +[1] " a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='c', na=F) +[1] " \"a\" " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='c', na=T) +[1] " \"a\" " " NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='l', na=F) +[1] "\"a\" " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='l', na=T) +[1] "\"a\" " "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='n', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='n', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='r', na=F) +[1] " \"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='"', justify='r', na=T) +[1] " \"a\"" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='c', na=F) +[1] " 'a' " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='c', na=T) +[1] " 'a' " " NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='l', na=F) +[1] "'a' " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='l', na=T) +[1] "'a' " "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='n', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='n', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='r', na=F) +[1] " 'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='\'', justify='r', na=T) +[1] " 'a'" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='c', na=F) +[1] " aaa " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='c', na=T) +[1] " aaa " " NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='l', na=F) +[1] "aaa " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='l', na=T) +[1] "aaa " "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='n', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='n', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='r', na=F) +[1] " aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote='a', justify='r', na=T) +[1] " aaa" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='c', na=F) +[1] " a " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='c', na=T) +[1] " a " " <NA> " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='l', na=F) +[1] "a " NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='l', na=T) +[1] "a " "<NA> " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='n', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='n', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='r', na=F) +[1] " a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = 7, quote=, justify='r', na=T) +[1] " a" " <NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='c', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='c', na=T) +[1] "\"a\" " " NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='l', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='l', na=T) +[1] "\"a\" " "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='n', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='n', na=T) +[1] "\"a\"" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='r', na=F) +[1] "\"a\"" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='"', justify='r', na=T) +[1] " \"a\"" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='c', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='c', na=T) +[1] "'a' " " NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='l', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='l', na=T) +[1] "'a' " "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='n', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='n', na=T) +[1] "'a'" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='r', na=F) +[1] "'a'" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='\'', justify='r', na=T) +[1] " 'a'" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='c', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='c', na=T) +[1] "aaa " " NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='l', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='l', na=T) +[1] "aaa " "NA " + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='n', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='n', na=T) +[1] "aaa" "NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='r', na=F) +[1] "aaa" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote='a', justify='r', na=T) +[1] " aaa" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='c', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='c', na=T) +[1] "a " "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='l', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='l', na=T) +[1] "a " "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='n', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='n', na=T) +[1] "a" "<NA>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='r', na=F) +[1] "a" NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testEncodeString# +#encodeString(c('a',NA), width = NA, quote=, justify='r', na=T) +[1] " a" "<NA>" ##com.oracle.truffle.r.test.builtins.TestBuiltin_encodeString.testencodeString1# #argv <- list(c('1', '2', NA), 0L, '\'', 0L, FALSE); .Internal(encodeString(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]])) @@ -24901,6 +26285,89 @@ NULL Warning message: In formals(argv[[1]]) : argument is not a function +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#.Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.')) +[1] "<environment: R_GlobalEnv>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.1, scientific=-10) +[1] "1.1e+00" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.1, scientific=FALSE) +[1] "1.1" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.1, scientific=TRUE) +[1] "1.1e+00" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.1, scientific=c(-10, 1)) +Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : + invalid 'scientific' argument + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.1, scientific=c(TRUE, FALSE)) +Error in prettyNum(.Internal(format(x, trim, digits, nsmall, width, 3L, : + invalid 'scientific' argument + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.6000085, digits=7) +[1] "1.600008" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.6001095, digits=7) +[1] "1.60011" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(1.60085, digits=5) +[1] "1.6009" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat#Ignored.OutputFormatting# +#format(1.6011095, digits=7) +[1] "1.601109" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(4.125e-04, digits=3) +[1] "0.000412" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(4.135e-04, digits=3) +[1] "0.000414" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(7) +[1] "7" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(7.42) +[1] "7.42" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(9.999999995, digits=10) +[1] "9.999999995" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(9.999999999995, digits=13); format(9.999999999995, digits=11) +[1] "9.999999999995" +[1] "10" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(c(7,42)) +[1] " 7" "42" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(c(7.42,42.7)) +[1] " 7.42" "42.70" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(c(7.42,42.7,NA)) +[1] " 7.42" "42.70" " NA" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testFormat# +#format(c(9.99951, 13.1), digits=4) +[1] "10.0" "13.1" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_format.testformat1#Output.IgnoreErrorMessage# #argv <- list(structure(c(0, 72.7, 56.4, 72.7, 0, 63.3, 56.4, 63.3, 0), .Dim = c(3L, 3L), .Dimnames = list(c('Girth', 'Height', 'Volume'), c('Girth', 'Height', 'Volume'))), FALSE, 7L, 0L, NULL, 3L, TRUE, NA, "."); .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]], argv[[9]], , argv[[9]])) Error in .Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], : @@ -26696,6 +28163,33 @@ Error: unexpected '[' in "argv <- list(''([" attr(,"Rd_tag") [1] "TEXT" +##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv# +#Sys.setlocale('LC_CTYPE', 'C'); iconv(c('²a²²','b')); Sys.setlocale('LC_CTYPE', 'UTF-8'); iconv(c('²a²²','b')) +[1] "C" +[1] NA "b" +[1] "UTF-8" +[1] "²a²²" "b" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv# +#iconv('foo²²', 'UTF8', 'ASCII') +[1] NA + +##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv# +#iconv('foo²²', 'UTF8', 'ASCII', sub='') +[1] "foo" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#Ignored.Unimplemented# +#iconv('foo²²', 'UTF8', 'ASCII', sub='byte') +[1] "foo<c2><b2><c2><b2>" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv# +#iconv('foo²²', 'UTF8', 'ASCII', sub='f') +[1] "fooffff" + +##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv#Ignored.Unimplemented# +#iconv('foo²²', 'UTF8', 'ASCII', sub='fooooo') +[1] "foofooooofooooofooooofooooo" + ##com.oracle.truffle.r.test.builtins.TestBuiltin_iconv.testIconv# #{ .Internal(iconv("7", "latin1", "ASCII", 42, T, F)) } Error: invalid 'sub' argument @@ -43832,6 +45326,13 @@ Error in options(NA) : invalid argument #options(list(NULL)); Error in options(list(NULL)) : list argument has no valid names +##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder# +#invisible(Sys.setlocale('LC_COLLATE', 'EN_us')); str(as.data.frame(list(a=c('A wo','Far ','abc ')))); invisible(Sys.setlocale('LC_COLLATE', 'C')); str(as.data.frame(list(a=c('A wo','Far ','abc ')))); +'data.frame': 3 obs. of 1 variable: + $ a: Factor w/ 3 levels "A wo","abc ",..: 1 3 2 +'data.frame': 3 obs. of 1 variable: + $ a: Factor w/ 3 levels "A wo","Far ",..: 1 2 3 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_order.testOrder# #order(c('40 50', '405', '40 51', '4028', '40 20', '40 30', '404')) [1] 5 6 1 3 4 7 2 @@ -49298,7 +50799,15 @@ Error in rmultinom(1, 1, NULL) : no positive probabilities #{ round(1.1234+1i, 3.1+1i); } [1] 1.123+1i -##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound#Ignored.ImplementationError# +##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# +#{ round(1.123456,digit=2.3) } +[1] 1.12 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# +#{ round(1.123456,digit=2.5) } +[1] 1.123 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# #{ round(1.123456,digit=2.8) } [1] 1.123 @@ -49310,6 +50819,18 @@ Error in rmultinom(1, 1, NULL) : no positive probabilities #{ round(1/0) } [1] Inf +##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# +#{ round(12344.123456,digit=-2.3) } +[1] 12300 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# +#{ round(12344.123456,digit=-2.5) } +[1] 12300 + +##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# +#{ round(12344.126,digit=-2.8) } +[1] 12000 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_round.testRound# #{ round(1L) } [1] 1 @@ -69312,6 +70833,11 @@ In sum(argv[[1]]) : integer overflow - use sum(as.numeric(.)) #sum( ); [1] 0 +##com.oracle.truffle.r.test.builtins.TestBuiltin_summary.testSummary# +#summary(c(1.601,1.616)) + Min. 1st Qu. Median Mean 3rd Qu. Max. + 1.601 1.605 1.609 1.609 1.612 1.616 + ##com.oracle.truffle.r.test.builtins.TestBuiltin_summary.testsummary1#Ignored.OutputFormatting# #argv <- structure(list(object = structure(c(4L, 4L, 4L, 4L, 4L, 3L, 4L, 4L, 4L, 4L, 3L, 4L, 3L, 4L, 4L, 4L, 4L, 2L, 4L, 3L, 4L, 4L, 4L, 2L), .Dim = c(6L, 4L), .Dimnames = structure(list(c('25-34', '35-44', '45-54', '55-64', '65-74', '75+'), c('0-39g/day', '40-79', '80-119', '120+')), .Names = c('', '')), class = 'table')), .Names = 'object');do.call('summary', argv) Number of cases in table: 88 @@ -74127,6 +75653,14 @@ In f() : foo Warning message: In f() : foo +##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning# +#options(warn=1); f <- function() warning('foo'); f() +Warning in f() : foo + +##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning# +#options(warn=1); f <- function() warning('foo'); f2 <- function() f(); f2() +Warning in f() : foo + ##com.oracle.truffle.r.test.builtins.TestBuiltin_warning.testwarning# #warning('foo') Warning message: diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java index 0d85c13983bd226b426faee46368da5d0a04519a..e054c71b60788326bb17fb7676cf485e902cb1da 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/S4/TestS4.java @@ -51,8 +51,8 @@ public class TestS4 extends TestRBase { assertEval("{ x<-42; slot(x, \".Data\") }"); // disabled because of side effects causing other tests to fail - assertEval(Ignored.ImplementationError, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-x@.Data; removeClass(\"foo\"); res }"); - assertEval(Ignored.ImplementationError, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-slot(x, \".Data\"); removeClass(\"foo\"); res }"); + assertEval(Ignored.SideEffects, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-x@.Data; removeClass(\"foo\"); res }"); + assertEval(Ignored.SideEffects, "{ setClass(\"foo\", contains=\"numeric\"); x<-new(\"foo\"); res<-slot(x, \".Data\"); removeClass(\"foo\"); res }"); assertEval(Output.IgnoreErrorContext, "{ getClass(\"ClassUnionRepresentation\")@foo }"); assertEval(Output.IgnoreErrorContext, "{ c(42)@foo }"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java index bedd0f6b53227c781598001fa35e63bb4713b65e..4c37f829ff859a89fd7aeb5697cdde53896eac4d 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_La.java @@ -42,9 +42,7 @@ public class TestBuiltin_La extends TestBase { @Test public void testLa4() { - // FIXME RInternalError: not implemented: .Internal La_svd - assertEval(Ignored.Unimplemented, - "argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))"); + assertEval("argv <- list('S', structure(c(1, 0, 0, 0, 0, 1.4142135623731, 0, 0, 0, 0, 1.73205080756888, 0, 0, 0, 0, 2), .Dim = c(4L, 4L), Dimnames = list(character(0), character(0))), c(2, 1.73205080756888, 1.4142135623731, 1), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L)), structure(c(0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0), .Dim = c(4L, 4L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))"); } @Test @@ -67,9 +65,7 @@ public class TestBuiltin_La extends TestBase { @Test public void testLa8() { - // FIXME RInternalError: not implemented: .Internal La_svd - assertEval(Ignored.Unimplemented, - "argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))"); + assertEval("argv <- list('N', structure(c(-4, 0, 0, 0, 0, 0, 0, -406.725, 41.7955066364795, 0, 0, 0, 0, 0, -1550.79375, 381.717151319926, 49.8228991342168, 0, 0, 0, 0, -1277.325, 224.617432123818, -31.1858918860748, -282.060212912726, 0, 0, 0, -1042.675, 125.261805546114, -29.9849484767744, 164.425554254677, -170.353263600129, 0, 0, -469.696, 26.3795103523805, 4.19691803785862, -3.18974110831568, 0.0462484557378925, 1.46320172717486, 0, -7818, 18.2758880432689, 1.77525956575195, -1.45298766739792, -0.449176219307484, -0.281900648530911, -0.669305080560524), .Dim = c(7L, 7L), .Dimnames = list(c('1947', '1948', '1949', '1950', '1951', '1952', '1953'), c('(Intercept)', 'GNP.deflator', 'GNP', 'Unemployed', 'Armed.Forces', 'Population', 'Year'))), c(8164.12940108939, 457.24498274114, 324.584423503013, 134.312174464868, 4.95553195929945, 1.41954832076337, 0.000342370904183799), structure(0, .Dim = c(1L, 1L)), structure(0, .Dim = c(1L, 1L))); .Internal(La_svd(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]]))"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java index c309948ee3e21f721b0e009da320699eae989429..c5201e71ff258f8289ac4fca78add57bdfc7f271 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_asmatrix.java @@ -60,8 +60,8 @@ public class TestBuiltin_asmatrix extends TestBase { assertEval("{ matrix(c(1+1i,2+2i,3+3i,4+4i),2) }"); assertEval("{ matrix(nrow=2,ncol=2) }"); assertEval("{ matrix(1:4,2,2) }"); - assertEval(Ignored.ReferenceError, "{ matrix(1i,10,10) }"); - assertEval(Ignored.ReferenceError, "{ matrix(c(1i,NA),10,10) }"); + assertEval("{ matrix(1i,10,10) }"); + assertEval("{ matrix(c(1i,NA),10,10) }"); assertEval("{ matrix(c(10+10i,5+5i,6+6i,20-20i),2) }"); assertEval("{ matrix(c(1i,100i),10,10) }"); assertEval("{ matrix(1:6, nrow=3,byrow=TRUE)}"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java index 20fbc5bba758da0032fc387b4528b797258e17af..6d8d3d0603b1eeb5cf07ea4d2857a0794054ad8b 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_dqr.java @@ -36,7 +36,7 @@ public class TestBuiltin_dqr extends TestBase { @Test public void testdqrcf() { - assertEval(Ignored.OutputFormatting, ".Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L)"); + assertEval(".Fortran(.F_dqrcf, 1, 1L, 1L, 1, 1, 1L, 1, 1L)"); } @Test diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java index 6f0d875ceb61aedff8536e61195001ab6d670712..29a4623970125f5ee95b1fd6c2a7ebcf21e9d8a9 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_encodeString.java @@ -78,19 +78,11 @@ public class TestBuiltin_encodeString extends TestBase { @Test public void testEncodeString() { - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA);}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, justify = \"right\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, quote = \"'\", justify = \"right\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 0, quote = \"'\", justify = \"right\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 0, quote = \"\", justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 3, quote = \"'\", justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = NA, quote = \"'\", na.encode=FALSE, justify = \"right\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 0, quote = \"'\", na.encode=FALSE, justify = \"right\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 3, quote = \"'\", na.encode=FALSE, justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 2, quote = \"'\", na.encode=FALSE, justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 7, quote = \"\", na.encode=FALSE, justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 7, quote = \"\", na.encode=TRUE, justify = \"centre\");}"); - assertEval("{x <- c(\"a\", \"ab\", \"abcde\", NA); encodeString(x, width = 3, quote = \"\", na.encode=TRUE, justify = \"centre\");}"); + String[] strings = new String[]{"c('a','ab','abcde',NA,'\\t\\n\\u1234foo\\\"\\'')", "c('a',NA)"}; + String[] widths = new String[]{"0", "1", "3", "7", "NA"}; + String[] quote = new String[]{"'a'", "'\\''", "'\"'", ""}; + String[] justify = new String[]{"'l'", "'r'", "'c'", "'n'"}; + String[] naEncode = new String[]{"T", "F"}; + assertEval(template("encodeString(%0, width = %1, quote=%2, justify=%3, na=%4)", strings, widths, quote, justify, naEncode)); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java index 80326152032cc3ce626d8515c6e1cd03b8773f53..a05621fb9d16772182e1bc1ba1712193235e1935 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_format.java @@ -287,17 +287,27 @@ public class TestBuiltin_format extends TestBase { assertEval("x <- c(1.0,2.0);names(x) <- c(\"x\",\"y\");argv <- list(x, FALSE, NULL, 0L, NULL, 0L, FALSE, FALSE, \".\");names(.Internal(format(argv[[1]], argv[[2]], argv[[3]], argv[[4]], argv[[5]], argv[[6]], argv[[7]], argv[[8]], argv[[9]])))"); } + @Test public void testFormat() { - assertEval("{ format(7) }"); - assertEval("{ format(7.42) }"); - assertEval("{ format(c(7,42)) }"); - assertEval("{ format(c(7.42,42.7)) }"); - assertEval("{ format(c(7.42,42.7,NA)) }"); - assertEval("{ .Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.')) }"); - assertEval("{ format(1.1, scientific=TRUE) }"); - assertEval("{ format(1.1, scientific=FALSE) }"); - assertEval("{ format(1.1, scientific=c(TRUE, FALSE)) }"); - assertEval("{ format(1.1, scientific=-10) }"); - assertEval("{ format(1.1, scientific=c(-10, 1)) }"); + assertEval("format(7)"); + assertEval("format(7.42)"); + assertEval("format(c(7,42))"); + assertEval("format(c(7.42,42.7))"); + assertEval("format(c(7.42,42.7,NA))"); + assertEval(".Internal(format(.GlobalEnv,FALSE,NA,0,0,3,TRUE,NA,'.'))"); + assertEval("format(1.1, scientific=TRUE)"); + assertEval("format(1.1, scientific=FALSE)"); + assertEval("format(1.1, scientific=c(TRUE, FALSE))"); + assertEval("format(1.1, scientific=-10)"); + assertEval("format(1.1, scientific=c(-10, 1))"); + assertEval("format(c(9.99951, 13.1), digits=4)"); + assertEval("format(1.60085, digits=5)"); + assertEval("format(1.6000085, digits=7)"); + assertEval("format(1.6001095, digits=7)"); + assertEval(Ignored.OutputFormatting, "format(1.6011095, digits=7)"); + assertEval("format(4.125e-04, digits=3)"); + assertEval("format(4.135e-04, digits=3)"); + assertEval("format(9.999999999995, digits=13); format(9.999999999995, digits=11)"); + assertEval("format(9.999999995, digits=10)"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java index b06ef8da33a6fdabcc15fc22b44759eca66e6e7d..9bb79a5737fe67f7dd476bf9b6253da18a1fe47f 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_iconv.java @@ -79,5 +79,11 @@ public class TestBuiltin_iconv extends TestBase { assertEval("{ .Internal(iconv(\"7\", \"latin1\", character(), \"42\", T, F)) }"); assertEval("{ .Internal(iconv(\"7\", \"latin1\", \"ASCII\", 42, T, F)) }"); assertEval("{ .Internal(iconv(\"7\", \"latin1\", \"ASCII\", character(), T, F)) }"); + assertEval("Sys.setlocale('LC_CTYPE', 'C'); iconv(c('²a²²','b')); Sys.setlocale('LC_CTYPE', 'UTF-8'); iconv(c('²a²²','b'))"); + assertEval("iconv('foo²²', 'UTF8', 'ASCII')"); + assertEval(Ignored.Unimplemented, "iconv('foo²²', 'UTF8', 'ASCII', sub='byte')"); + assertEval(Ignored.Unimplemented, "iconv('foo²²', 'UTF8', 'ASCII', sub='fooooo')"); + assertEval("iconv('foo²²', 'UTF8', 'ASCII', sub='f')"); + assertEval("iconv('foo²²', 'UTF8', 'ASCII', sub='')"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java index c9fd1e66c528a19b8c3428e924043b95eb401e2e..5763cc90d503db4d178973cc9159ce6ebe5f1fa8 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_order.java @@ -164,5 +164,7 @@ public class TestBuiltin_order extends TestBase { assertEval("order(c('40 50', '405', '40 51', '4028', '40 20', '40 30', '404'))"); assertEval("order(c(1,2,0), decreasing=NA)"); + + assertEval("invisible(Sys.setlocale('LC_COLLATE', 'EN_us')); str(as.data.frame(list(a=c('A wo','Far ','abc ')))); invisible(Sys.setlocale('LC_COLLATE', 'C')); str(as.data.frame(list(a=c('A wo','Far ','abc '))));"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java index 1101dc9b129c1b46fa0d40ad1ca5fa7bc23745c4..e5981201e3b595f02f0d3b8d867d8e62a2568657 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_round.java @@ -48,9 +48,12 @@ public class TestBuiltin_round extends TestBase { assertEval("{ round(c(0,0.2,NaN,0.6,NA,1)) }"); assertEval("{ round(as.complex(c(0,0.2,NaN,0.6,NA,1))) }"); - // FIXME: we need to decide whether 2.8 means three digits (GnuR) or two (FastR) when - // calling round() - assertEval(Ignored.ImplementationError, "{ round(1.123456,digit=2.8) }"); + assertEval("{ round(1.123456,digit=2.8) }"); + assertEval("{ round(1.123456,digit=2.5) }"); + assertEval("{ round(1.123456,digit=2.3) }"); + assertEval("{ round(12344.126,digit=-2.8) }"); + assertEval("{ round(12344.123456,digit=-2.5) }"); + assertEval("{ round(12344.123456,digit=-2.3) }"); assertEval("{ typeof(round(42L)); }"); assertEval("{ typeof(round(TRUE)); }"); diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java index bdd46202cfd8e039ae46b5be09f8b5380c8cd6d1..4005ecd53c17e83c5bade73b380d933bb474080d 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_summary.java @@ -37,4 +37,9 @@ public class TestBuiltin_summary extends TestBase { assertEval("argv <- structure(list(object = structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8, 5.7, 5.4, 5.1, 5.7, 5.1, 5.4, 5.1, 4.6, 5.1, 4.8, 5, 5, 5.2, 5.2, 4.7, 4.8, 5.4, 5.2, 5.5, 4.9, 5, 5.5, 4.9, 4.4, 5.1, 5, 4.5, 4.4, 5, 5.1, 4.8, 5.1, 4.6, 5.3, 5, 7, 6.4, 6.9, 5.5, 6.5, 5.7, 6.3, 4.9, 6.6, 5.2, 5, 5.9, 6, 6.1, 5.6, 6.7, 5.6, 5.8, 6.2, 5.6, 5.9, 6.1, 6.3, 6.1, 6.4, 6.6, 6.8, 6.7, 6, 5.7, 5.5, 5.5, 5.8, 6, 5.4, 6, 6.7, 6.3, 5.6, 5.5, 5.5, 6.1, 5.8, 5, 5.6, 5.7, 5.7, 6.2, 5.1, 5.7, 6.3, 5.8, 7.1, 6.3, 6.5, 7.6, 4.9, 7.3, 6.7, 7.2, 6.5, 6.4, 6.8, 5.7, 5.8, 6.4, 6.5, 7.7, 7.7, 6, 6.9, 5.6, 7.7, 6.3, 6.7, 7.2, 6.2, 6.1, 6.4, 7.2, 7.4, 7.9, 6.4, 6.3, 6.1, 7.7, 6.3, 6.4, 6, 6.9, 6.7, 6.9, 5.8, 6.8, 6.7, 6.7, 6.3, 6.5, 6.2, 5.9), Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4, 4.4, 3.9, 3.5, 3.8, 3.8, 3.4, 3.7, 3.6, 3.3, 3.4, 3, 3.4, 3.5, 3.4, 3.2, 3.1, 3.4, 4.1, 4.2, 3.1, 3.2, 3.5, 3.6, 3, 3.4, 3.5, 2.3, 3.2, 3.5, 3.8, 3, 3.8, 3.2, 3.7, 3.3, 3.2, 3.2, 3.1, 2.3, 2.8, 2.8, 3.3, 2.4, 2.9, 2.7, 2, 3, 2.2, 2.9, 2.9, 3.1, 3, 2.7, 2.2, 2.5, 3.2, 2.8, 2.5, 2.8, 2.9, 3, 2.8, 3, 2.9, 2.6, 2.4, 2.4, 2.7, 2.7, 3, 3.4, 3.1, 2.3, 3, 2.5, 2.6, 3, 2.6, 2.3, 2.7, 3, 2.9, 2.9, 2.5, 2.8, 3.3, 2.7, 3, 2.9, 3, 3, 2.5, 2.9, 2.5, 3.6, 3.2, 2.7, 3, 2.5, 2.8, 3.2, 3, 3.8, 2.6, 2.2, 3.2, 2.8, 2.8, 2.7, 3.3, 3.2, 2.8, 3, 2.8, 3, 2.8, 3.8, 2.8, 2.8, 2.6, 3, 3.4, 3.1, 3, 3.1, 3.1, 3.1, 2.7, 3.2, 3.3, 3, 2.5, 3, 3.4, 3), Petal.Length = c(1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 1.2, 1.5, 1.3, 1.4, 1.7, 1.5, 1.7, 1.5, 1, 1.7, 1.9, 1.6, 1.6, 1.5, 1.4, 1.6, 1.6, 1.5, 1.5, 1.4, 1.5, 1.2, 1.3, 1.4, 1.3, 1.5, 1.3, 1.3, 1.3, 1.6, 1.9, 1.4, 1.6, 1.4, 1.5, 1.4, 4.7, 4.5, 4.9, 4, 4.6, 4.5, 4.7, 3.3, 4.6, 3.9, 3.5, 4.2, 4, 4.7, 3.6, 4.4, 4.5, 4.1, 4.5, 3.9, 4.8, 4, 4.9, 4.7, 4.3, 4.4, 4.8, 5, 4.5, 3.5, 3.8, 3.7, 3.9, 5.1, 4.5, 4.5, 4.7, 4.4, 4.1, 4, 4.4, 4.6, 4, 3.3, 4.2, 4.2, 4.2, 4.3, 3, 4.1, 6, 5.1, 5.9, 5.6, 5.8, 6.6, 4.5, 6.3, 5.8, 6.1, 5.1, 5.3, 5.5, 5, 5.1, 5.3, 5.5, 6.7, 6.9, 5, 5.7, 4.9, 6.7, 4.9, 5.7, 6, 4.8, 4.9, 5.6, 5.8, 6.1, 6.4, 5.6, 5.1, 5.6, 6.1, 5.6, 5.5, 4.8, 5.4, 5.6, 5.1, 5.1, 5.9, 5.7, 5.2, 5, 5.2, 5.4, 5.1), Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2, 0.4, 0.4, 0.3, 0.3, 0.3, 0.2, 0.4, 0.2, 0.5, 0.2, 0.2, 0.4, 0.2, 0.2, 0.2, 0.2, 0.4, 0.1, 0.2, 0.2, 0.2, 0.2, 0.1, 0.2, 0.2, 0.3, 0.3, 0.2, 0.6, 0.4, 0.3, 0.2, 0.2, 0.2, 0.2, 1.4, 1.5, 1.5, 1.3, 1.5, 1.3, 1.6, 1, 1.3, 1.4, 1, 1.5, 1, 1.4, 1.3, 1.4, 1.5, 1, 1.5, 1.1, 1.8, 1.3, 1.5, 1.2, 1.3, 1.4, 1.4, 1.7, 1.5, 1, 1.1, 1, 1.2, 1.6, 1.5, 1.6, 1.5, 1.3, 1.3, 1.3, 1.2, 1.4, 1.2, 1, 1.3, 1.2, 1.3, 1.3, 1.1, 1.3, 2.5, 1.9, 2.1, 1.8, 2.2, 2.1, 1.7, 1.8, 1.8, 2.5, 2, 1.9, 2.1, 2, 2.4, 2.3, 1.8, 2.2, 2.3, 1.5, 2.3, 2, 2, 1.8, 2.1, 1.8, 1.8, 1.8, 2.1, 1.6, 1.9, 2, 2.2, 1.5, 1.4, 2.3, 2.4, 1.8, 1.8, 2.1, 2.4, 2.3, 1.9, 2.3, 2.5, 2.3, 1.9, 2, 2.3, 1.8), Species = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c('setosa', 'versicolor', 'virginica'), class = 'factor')), .Names = c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species'), row.names = c(NA, -150L), class = 'data.frame')), .Names = 'object');" + "do.call('summary', argv)"); } + + @Test + public void testSummary() { + assertEval("summary(c(1.601,1.616))"); + } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java index 32105348fa57130763f66c036128cdf7a7b1df13..bfdb68d4c6605342b937132948869c7d43c28705 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/builtins/TestBuiltin_warning.java @@ -4,7 +4,7 @@ * http://www.gnu.org/licenses/gpl-2.0.html * * Copyright (c) 2014, Purdue University - * Copyright (c) 2014, 2016, Oracle and/or its affiliates + * Copyright (c) 2014, 2017, Oracle and/or its affiliates * * All rights reserved. */ @@ -22,6 +22,8 @@ public class TestBuiltin_warning extends TestBase { public void testwarning() { assertEval("warning('foo')"); assertEval("f <- function() warning('foo'); f()"); + assertEval("options(warn=1); f <- function() warning('foo'); f()"); assertEval("f <- function() warning('foo'); f2 <- function() f(); f2()"); + assertEval("options(warn=1); f <- function() warning('foo'); f2 <- function() f(); f2()"); } } diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java index e3311fb6481737378c6d2f478032e554e08fd14b..b03e4a7ac0b900141e3d85fbb33ac7dc3232e026 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/FastRSession.java @@ -30,7 +30,8 @@ import java.nio.CharBuffer; import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; import java.nio.charset.StandardCharsets; -import java.util.TimeZone; +import java.util.HashMap; +import java.util.Map; import java.util.Timer; import java.util.TimerTask; @@ -113,7 +114,9 @@ public final class FastRSession implements RSession { public ChildContextInfo createContextInfo(ContextKind contextKind) { RStartParams params = new RStartParams(RCmdOptions.parseArguments(Client.R, new String[]{"R", "--vanilla", "--slave", "--silent", "--no-restore"}, false), false); - return ChildContextInfo.create(params, null, contextKind, mainContext, input, output, output, TimeZone.getTimeZone("GMT")); + Map<String, String> env = new HashMap<>(); + env.put("TZ", "GMT"); + return ChildContextInfo.create(params, env, contextKind, mainContext, input, output, output); } private FastRSession() { diff --git a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java index 8c6ba569e21b2e0d0dde22e63cefc4b910037fa3..bc65c7c6312c41b0e8b947e6f27be1bd0cdb6f5a 100644 --- a/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java +++ b/com.oracle.truffle.r.test/src/com/oracle/truffle/r/test/generate/GnuROneShotRSession.java @@ -86,6 +86,8 @@ public class GnuROneShotRSession implements RSession { // fix time zone to "GMT" (to create consistent expected output) pb.environment().put("TZ", "GMT"); pb.environment().remove("R_HOME"); // don't confuse GnuR with FastR! + pb.environment().remove("LC_ALL"); + pb.environment().remove("LC_COLLATE"); pb.redirectErrorStream(true); Process p = pb.start(); p.getOutputStream().write(GNUR_OPTIONS.getBytes()); diff --git a/mx.fastr/mx_fastr_pkgs.py b/mx.fastr/mx_fastr_pkgs.py index 83b8f238bb76e900bbfc48565c9688313bb431ec..a505536eba508fd6134f03d5a50c02deca8d5317 100644 --- a/mx.fastr/mx_fastr_pkgs.py +++ b/mx.fastr/mx_fastr_pkgs.py @@ -313,8 +313,11 @@ def _get_test_outputs(rvm, pkg_name, test_info): for f in files: ext = os.path.splitext(f)[1] # suppress .pdf's for now (we can't compare them) - ignore = ['.R', '.Rin', '.prev', '.bug', '.pdf', '.save'] - if f == 'test_time' or ext in ignore: + # ignore = ['.R', '.Rin', '.prev', '.bug', '.pdf', '.save'] + # if f == 'test_time' or ext in ignore: + # continue + included = ['.Rout', '.fail'] + if f == 'test_time' or not ext in included: continue status = "OK" if ext == '.fail': @@ -498,7 +501,13 @@ def _find_line(gnur_line, fastr_content, fastr_i): fastr_i = fastr_i + 1 return -1 +def _replace_engine_references(output): + for idx, val in enumerate(output): + output[idx] = val.replace('fastr', '<engine>').replace('gnur', '<engine>') + def _fuzzy_compare(gnur_content, fastr_content): + _replace_engine_references(gnur_content) + _replace_engine_references(fastr_content) gnur_start = _find_start(gnur_content) gnur_end = _find_end(gnur_content) fastr_start = _find_start(fastr_content)