Example #1
0
    def mapPythonInstanceToPyforaInstance(self, numpyArray):
        flattened = numpyArray.flatten()
        dtypeAsPrim = TypeDescription.dtypeToPrimitive(numpyArray.dtype)

        if dtypeAsPrim is not None:
            return PurePythonNumpyArray(
                numpyArray.shape,
                TypeDescription.PackedHomogenousData(dtypeAsPrim,
                                                     flattened.tostring()))
        else:
            return PurePythonNumpyArray(numpyArray.shape, flattened.tolist())
Example #2
0
 def test_numpy_dtype_conversion(self):
     for array in [
             numpy.array([1.0, 2.0]),
             numpy.zeros(2, dtype=[('f0', '<f8'), ('f1', '<f8')]),
             numpy.array([1]),
             numpy.array([False])
     ]:
         dt = array.dtype
         dt2 = TypeDescription.primitiveToDtype(
             TypeDescription.dtypeToPrimitive(array.dtype))
         self.assertEqual(str(dt.descr), str(dt2.descr))
Example #3
0
        def transformBody(objId, implval):
            if isUnconvertibleValueTuple(implval):
                path = implval[0].pyval
                stream.defineUnconvertible(objId, path)
                return objId

            if isPyforaNameErrorTuple(implval):
                payload = implval[0]

                varname = payload[0].pyval
                lineno = payload[1].pyval
                col_offset = payload[2].pyval
                
                stream.defineUnresolvedVarWithPosition(
                    objId,
                    varname,
                    lineno,
                    col_offset)
                return objId

            if implval.isString():
                value = (implval.pyval,)
            else:
                value = self.nativeConverterAdaptor.invertForaConstant(implval)

            if value is not None:
                if isinstance(value, tuple):
                    #this is a simple constant
                    stream.definePrimitive(objId, value[0])
                    return objId
                else:
                    #this is a vector that represents a string
                    assert isinstance(value, ForaNative.ImplValContainer)

                    if len(value) == 0:
                        stream.definePrimitive(objId, "")
                        return objId

                    assert value.isVectorOfChar(), value

                    contents = vectorContentsExtractor(value)

                    if contents is None:
                        anyNeedLoading[0] = True
                        stream.definePrimitive(objId, "")
                        return objId
                    else:
                        assert 'string' in contents
                        stream.definePrimitive(objId, contents['string'])
                        return objId

            if self.singletonAndExceptionConverter is not None:
                value = self.singletonAndExceptionConverter.convertInstanceToSingletonName(implval)
                if value is not None:
                    stream.defineNamedSingleton(objId, value)
                    return objId

                value = self.singletonAndExceptionConverter.convertExceptionInstance(implval)
                if value is not None:
                    stream.defineBuiltinExceptionInstance(objId, value[0], transform(value[1]))
                    return objId

                value = self.singletonAndExceptionConverter.convertPyAbortExceptionInstance(
                    implval
                    )
                if value is not None:
                    stream.definePyAbortException(objId, value[0], transform(value[1]))
                    return objId

            value = self.nativeConverterAdaptor.invertTuple(implval)
            if value is not None:
                tupleIds = tuple([transform(x) for x in value])
                stream.defineTuple(objId, tupleIds)
                return objId

            value = self.nativeConverterAdaptor.invertDict(implval)
            if value is not None:
                stream.defineDict(
                    objId,
                    [transform(k) for k in value.keys()],
                    [transform(v) for v in value.values()]
                    )
                return objId

            listItemsAsVector = self.nativeConverterAdaptor.invertList(implval)
            if listItemsAsVector is not None:
                contents = vectorContentsExtractor(listItemsAsVector)

                if contents is None:
                    stream.defineList(objId, [])
                    anyNeedLoading[0] = True
                    return objId
                elif 'listContents' in contents:
                    stream.defineList(objId, [transform(x) for x in contents['listContents']])
                    return objId
                else:
                    assert 'contentsAsNumpyArray' in contents
                    contentsAsNumpy = contents['contentsAsNumpyArray']

                    stream.definePackedHomogenousData(
                        objId,
                        TypeDescription.PackedHomogenousData(
                            TypeDescription.dtypeToPrimitive(contentsAsNumpy.dtype),
                            contentsAsNumpy.tostring()
                            )
                        )

                    return objId

            if implval.isStackTrace():
                stackTraceAsJsonOrNone = self.getStackTraceAsJsonOrNone(implval)
                if stackTraceAsJsonOrNone is not None:
                    stream.defineStacktrace(objId, stackTraceAsJsonOrNone)
                    return objId
                else:
                    assert False, "unknown tuple, but not a stacktrace: %s" % implval

            if implval.isObject():
                objectClass = implval.getObjectClass()

                if objectClass == self.pyforaBoundMethodClass:
                    nameAsImplval = implval.getObjectLexicalMember("@name")[0]
                    if not nameAsImplval.isSymbol():
                        raise pyfora.ForaToPythonConversionError(
                            "PyBoundMethod found with name %s of type %s, which should be a symbol but is not."
                                % (nameAsImplval, nameAsImplval.type)
                            )

                    stream.defineInstanceMethod(
                        objId,
                        transform(implval.getObjectLexicalMember("@self")[0]),
                        nameAsImplval.pyval[1:]
                        )
                    return objId

                sourcePathAndLine = self.extractSourcePathAndLine(implval)

                if sourcePathAndLine is not None:
                    if objectClass is not None:
                        classObjectId = transform(objectClass)
                        members = {}

                        for memberName in objectClass.objectMembers:
                            if memberName is not None:
                                member = implval.getObjectLexicalMember(memberName)
                                if member is not None and member[1] is None:
                                    assert memberName == "@m"
                                    assert member[0].isTuple()

                                    membersTuple = member[0]
                                    memberNames = membersTuple.getTupleNames()
                                    for i, name in enumerate(memberNames):
                                        result = transform(membersTuple[i])

                                        if result is not UnconvertibleToken:
                                            members[str(name)] = transform(membersTuple[i])

                        stream.defineClassInstance(objId, classObjectId, members)

                        return objId
                    else:
                        members = {}
                        lexicalMembers = implval.objectLexicalMembers
                        for memberAndBindingSequence in lexicalMembers.iteritems():
                            #if the binding sequence is empty, then this binding refers to 'self'
                            if isinstance(memberAndBindingSequence[1], ForaNative.ImplValContainer) or memberAndBindingSequence[1][0]:
                                memberName = memberAndBindingSequence[0]
                                member = implval.getObjectLexicalMember(memberName)
                                if member is not None and member[1] is None:
                                    if member[0] != Symbol_uninitialized:
                                        transformed = transform(member[0])

                                        if transformed is not UnconvertibleToken:
                                            members[(str(memberName),)] = transformed

                        sourceFileId = transformFile(sourcePathAndLine[1], sourcePathAndLine[0])

                        stream.defineFunction(
                            objId,
                            sourceFileId,
                            sourcePathAndLine[2],
                            members
                            )

                        return objId

            elif implval.isClass():
                members = {}

                sourcePathAndLine = self.extractSourcePathAndLine(implval)
                
                lexicalMembers = implval.objectLexicalMembers
                for memberAndBindingSequence in lexicalMembers.iteritems():
                    #if the binding sequence is empty, then this binding refers to 'self'
                    if isinstance(memberAndBindingSequence[1], ForaNative.ImplValContainer) or memberAndBindingSequence[1][0]:
                        memberName = memberAndBindingSequence[0]
                        member = implval.getObjectLexicalMember(memberName)
                        if member is not None and member[1] is None:
                            result = transform(member[0])
                            if result is not UnconvertibleToken:
                                members[(str(memberName),)] = result

                om = implval.objectMetadata
                if 'classMetadata' in om:
                    om = om['classMetadata']
                om = om['sourceText'].objectMetadata

                sourceFileId = transformFile(sourcePathAndLine[1], sourcePathAndLine[0])
                
                stream.defineClass( 
                    objId,
                    sourceFileId,
                    sourcePathAndLine[2],
                    members,
                    #this is a little wrong. When going python->binary, we would have
                    #a list of base classes. When going pyfora->binary, we're holding the
                    #base classes by name as free variables.
                    ()
                    )
                return objId

            logging.error("Failed to convert %s of type %s back to python", implval, str(implval.type))

            raise pyfora.ForaToPythonConversionError(
                "Result cannot be translated back to python."
                )