summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pyisda/credit_index.pyx23
-rw-r--r--pyisda/curve.pyx2
2 files changed, 15 insertions, 10 deletions
diff --git a/pyisda/credit_index.pyx b/pyisda/credit_index.pyx
index 0f76e6d..ea26d3d 100644
--- a/pyisda/credit_index.pyx
+++ b/pyisda/credit_index.pyx
@@ -14,8 +14,7 @@ from .legs cimport (JpmcdsCdsContingentLegMake, JpmcdsCdsFeeLegMake,
from .curve cimport (SpreadCurve, JpmcdsCopyCurve, tweak_curve, YieldCurve,
JpmcdsFreeTCurve, survival_prob, Hash64WithSeed,
Hash64, uint64_t, CurveName,
- Seniority, DocClause, JpmcdsCdsParSpreads, name_offset_from_buf,
- buf_size)
+ Seniority, DocClause, JpmcdsCdsParSpreads, name_offset_from_buf)
from .date cimport (pydate_to_TDate, TDate_to_pydate, JpmcdsDtFwdAny,
TDateInterval, JpmcdsMakeDateInterval)
from .cdsone cimport JpmcdsStringToStubMethod, TStubMethod
@@ -223,14 +222,13 @@ cdef class CurveList:
def __deepcopy__(self, memo):
cdef:
- size_t i = 0
CurveList copy = CurveList.__new__(CurveList)
char* buf
char* new_buf
- int n
TCurve* curve
int size
CurveName cn
+ uint16_t offset
copy.base_date = self.base_date
copy._weights = self._weights
copy.base_date = self.base_date
@@ -238,10 +236,13 @@ cdef class CurveList:
copy.offset_recovery_rates = self.offset_recovery_rates
for p in self.names:
buf = self._curves[p.second].get()
- size = buf_size((<TCurve*>buf).fNumItems, p.first.ticker.size())
+ offset = p.first.name - buf
+ size = offset + p.first.size()
new_buf = <char*>malloc(size)
memcpy(new_buf, buf, size)
- cn = CurveName(new_buf + name_offset_from_buf(new_buf))
+ curve = <TCurve*>new_buf
+ curve.fArray = <TRatePt*>(new_buf + sizeof(TCurve))
+ cn = CurveName(new_buf + offset)
copy._curves[p.second] = shared_ptr[char](new_buf, char_free)
copy.names[cn] = p.second
copy.tickers = self.tickers
@@ -326,11 +327,13 @@ cdef class CreditIndex(CurveList):
pair[CurveName, size_t] p
char* buf
int n
+ uint16_t offset
for p in self.names:
buf = self._curves[p.second].get()
n = (<TCurve*>buf).fNumItems
- h ^= Hash64(<char*>buf, buf_size(n, p.first.ticker.size()))
+ offset = p.first.name - buf
+ h ^= Hash64(buf, offset + p.first.size())
h = Hash64WithSeed(<char*>&self._start_date, sizeof(TDate), h)
h = Hash64WithSeed(<char*>&self.base_date, sizeof(TDate), h)
@@ -605,6 +608,7 @@ cdef class CreditIndex(CurveList):
char* newbuf
size_t i
CurveName cn
+ uint16_t offset
if inplace:
for i in range(self._curves.size()):
sc_orig = <TCurve*>(self._curves[i].get())
@@ -613,8 +617,9 @@ cdef class CreditIndex(CurveList):
else:
for i in range(self._curves.size()):
buf = self._curves[i].get()
- cn = CurveName(buf + name_offset_from_buf(buf))
- buf_size = cn.size() + name_offset_from_buf(buf)
+ offset = name_offset_from_buf(buf)
+ cn = CurveName(buf + offset)
+ buf_size = cn.size() + offset
new_buf = <char*>malloc(buf_size)
memcpy(new_buf, buf, buf_size)
sc_orig = <TCurve*>buf
diff --git a/pyisda/curve.pyx b/pyisda/curve.pyx
index 5f6a125..5f98f4a 100644
--- a/pyisda/curve.pyx
+++ b/pyisda/curve.pyx
@@ -728,7 +728,7 @@ cdef class SpreadCurve(Curve):
JpmcdsFreeTCurve(curve)
else:
self.buf_size = buf_size(curve.fNumItems, ticker_len)
- buf = <char*>malloc(buf_size(curve.fNumItems, ticker_len))
+ buf = <char*>malloc(self.buf_size)
memcpy(buf, curve, sizeof(TCurve))
memcpy(buf + sizeof(TCurve), curve.fArray, curve.fNumItems * sizeof(TRatePt))
(<TCurve*>buf).fArray = <TRatePt*>(buf + sizeof(TCurve))