01:18:57 -!- echo-area [~user@123.120.254.255] has quit [Remote host closed the connection] 02:09:45 echo-area [~user@182.92.247.2] has joined #sbcl 02:50:20 pkhuong: are you online? 02:51:41 How does one allocate memory for evaluating arguments for a function call? 02:52:27 what do you mean? 02:52:56 Lets say I define: (defun xxx () (foo (bar 1) (baz 2))) 02:53:05 So I call (xxx) 02:54:07 This causes (bar 1) to be evaluated and the result put somewhere, and (baz 2) and it's result put somewhere and then foo is called with those two values as arguments. So I need to allocate an array of two values on the stack to store the intermediate results. 02:54:23 Within the function xxx 02:54:24 you can't use registers? 02:54:55 So I'm thinking about that. 02:55:35 drmeister: it's the same thing whether the result are later used in a function call or not. 02:55:37 I'd like to use registers and let LLVM deal with where to put them if they need to be spilled to memory. 02:56:19 usually, with LLVM, you define a stack frame struct (a fixed size array of lisp objects would probably work at first), and let mem2reg conert to SSA. 02:56:47 But the way I generate code I always have the generated code write its result into a memory location. Perhaps I shouldn't be doing that. 02:56:57 on entry, a single alloca allocates enough space in the stack frame. 02:58:31 I'd like to do that, but I maintain my pointers in C++ template classes called smart_ptr. They have a constructor/destructor. 02:59:01 generate code that calls these constructors and destructors. 02:59:58 Here's what I do right now - it's very inefficient I know. 02:59:59 -!- scymtym_ [~user@ip-5-147-115-29.unitymediagroup.de] has quit [Ping timeout: 252 seconds] 03:00:28 I allocate an array of smart-ptr's on the heap, evaluate the arguments into that array and pass the array to the callee. 03:01:14 I'm currently switching to varargs to speed this all up and use the stack more and the heap less. 03:01:51 so your question is actually about what your calling convention should look like? 03:02:05 It's about passing arguments, not evaluating them (in which case the answer is: same as everything else). 03:02:23 Sort of - here's what I've got right now. 03:02:52 Here's what my calling convention will look like: define internal void @A({ i32*, {}*, i32 }* %result-ptr, { i32*, {}* }* %closed-af-ptr, i32 %num-varargs, i8* %va-list) { 03:03:03 well, arguments are passed however you designed the calling convention. But allocating an array of arguments on the heap for each call is probably not ideal. 03:04:08 pkhuong: Passing an array of arguments on the heap was a quick way to get closures. 03:06:00 The function declaration reads as follows: {i32*,{}*, i32}* %result-ptr ; This is where the possibly multiple-value return is written to. 03:06:27 {i32*,{}*}* %closed-af-ptr ; this is the closed over environment activation frame 03:06:42 i32 %num-varargs ; number of varargs passed 03:07:00 i8* %va-list ; varargs list. 03:07:33 I'll think on this more and try and come back with a more precise question. 03:18:09 pkhuong: I may have asked you this before but were you the person who suggested a way of using C++ classes and slicing to deal with multiple-value returns? This happened several months ago. 03:18:23 yes. 03:21:03 Oh thank goodness, I didn't make a note of who taught me that. 03:21:53 Ok, I've been using it for months and it works great the way I implemented it. But now it's causing me a bit of grief that I'm implementing varargs functions. 03:22:20 Do you have a little time to discuss this? 03:22:31 I'll start anyway. 03:22:55 So I implemented the template class smart_ptr it has one virtual function int number_of_values() const { return 1;}; 03:23:59 Then I subclassed it in the class: template multiple_values : public smart_ptr { int numvals; virtual int number_of_values() const {return this->numvals;}} 03:24:19 So now functions can return smart_ptr and they return a single value. 03:24:36 Or they can return multiple_values and they can return multiple values. 03:25:24 Or - and here's the clever bit that you suggested - I can have a function return multiple_values and I can assign it to a smart_ptr and the multiple_values gets sliced down to a single value automagically. 03:25:54 Currently my functions take as arguments smart_ptr values. 03:25:58 Here's the problem. 03:26:17 varargs doesn't allow you to pass classes. 03:26:56 Are you with me sofar? 03:26:59 sure. 03:27:03 Sweet. 03:27:24 varargs only allows you to pass pointers (or integers or doubles). 03:27:49 I'd pass a pointer to a stack-allocated array of smart pointers. Not being able to pass them in registers is the least of your worries. 03:28:24 varargs wouldn't pass them in registers anyway, it puts everything on the stack. 03:28:31 not necessarily. 03:29:03 Really? I thought I understood that. 03:29:59 The SysV x86-64 C calling convention passes arguments in registers but I thought everything passed as "..." was pushed onto the stack right to left. 03:31:07 it'll also be a lot easier to generate in LLVM than passing compound objects by value (but if you want to go down that road, it may make sense to have a couple arguments in fixed positions). 03:32:41 I thought about a couple of arguments in fixed positions - I can do that later because it complicates the lambda-list processing on the callee side. 03:34:13 The top of my class hierarchy is the T_O class. I can downcast every argument that I'm passing to a T_O* pointer and pass that by value to the callee and then have the callee put the T_O* pointers onto the stack or on the heap (for closures). 03:36:36 I'm wondering if I can ditch the virtual function that returns the number of values in the smart_ptr and multiple_value template classes and just store it in thread-local storage. 03:36:54 Then they become simple pointers and a lot easier to deal with. 03:37:39 They won't each have a vtable. 03:38:51 -!- christoph_debian [~christoph@ppp-46-244-226-62.dynamic.mnet-online.de] has quit [Ping timeout: 252 seconds] 03:38:52 I've been working with these multiple_value classes for months - they are tried and true. To be honest, I've forgotten why I added the virtual function - do you remember what it's purpose is? Can't it be moved into thread-local storage? 03:40:06 you said you already had a vtable to support fixnums and all that. The point is that const references will call the right virtual function without slicing. 03:44:28 Wait - now that I think about it, it's coming back. I need the virtual function because otherwise each function return would need to reset the number-of-values being returned. 03:45:37 If I put it in a global variable then I could call FOO and it returns 5 values and then call BAR and if it just returned a single value and didn't explicitly reset the global NUMBER-OF-VALUES variable then the caller would thing BAR also returns 5 values and things would go horribly wrong. 03:45:57 "would think BAR also..." 03:47:26 And the slicing thing works great. T_sp is a typedef for smart_ptr I can say T_sp x = a_function_that_returns_5_values() and x slices the first value. 03:48:22 I never ended up using the const reference trick. It never seemed necessary - I should revisit that. 03:50:35 I just found my Evernote note with the herbsutter link you suggested. I'm reading it again. 03:51:18 if you don't use the const reference, then you don't need it to be virtual. You only have to make sure there's a constructor for multiple_value pointers from normal single values. 03:52:05 christoph_debian [~christoph@ppp-46-244-221-249.dynamic.mnet-online.de] has joined #sbcl 03:56:14 I'm sorry, I don't understand what you mean - it seems contrary to my experience. I don't use the const reference. I do think I need number_of_values to be virtual and for smart_ptr to always return "1" and for multiple_values to store an integer numvals and return that. I'll check if I have a multiple_value constructor that takes smart_ptr's - I don't think I use it if I do. I now have dozens of plac 03:56:14 es in my code where I return and extract multiple values and dozens where I return multiple values and they are automatically sliced to the first value by simply assigning the result to a smart_ptr 03:56:34 I'm not arguing, I just don't understand. 03:57:35 The slicing thing works because C++ copies the pointer stored in multiple_values into the pointer in a smart_ptr and doesn't change the vtable. 03:58:03 -!- loke_ [~loke@203.127.16.194] has quit [Remote host closed the connection] 03:58:23 I do have a constructor: multiple_values(const smart_ptr& v,int num) : smart_ptr(v), _number_of_values(num) {}; 04:01:31 Isn't that if I were to use the const reference trick that I wouldn't need the virtual function? I think that might be what I'm looking for. 04:03:21 Currently: T_mv mv_x = multiple_value_returning_func(); T_sp ret0 = mv_x; int numvals = mv_x.number_of_values(); T_sp ret1 = mv_x.valueGet(1); ... 04:06:35 Wait - I'm not sure why I'm using the virtual function at all. 04:06:44 *drmeister* might be over tired. 04:08:48 I might have misunderstood you several months ago, implemented something that works but is not optimal and moved on. 04:26:12 attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has joined #sbcl 05:08:47 Right - if you don't use the const reference then you don't need it to be virtual. 05:09:45 It seems to be working without the virtual function or the const reference. As it should, I'm just returning a struct that has the smart_ptr and a count of the number of values. 05:10:08 I don't know what I was thinking with the virtual function - that just complicates things. 05:11:21 I still don't appreciate the point of the const reference from the Herb Sutter article http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ - is it just to save having to return a structure from a function? 05:16:58 -!- yacks [~py@103.6.159.103] has quit [Quit: Leaving] 05:18:50 I don't know. you wanted a way to manipulate multiple values as though they were single values, but automatically coerce them to single values on return. 05:28:40 -!- oleo [~oleo@xdsl-78-35-180-166.netcologne.de] has quit [Ping timeout: 264 seconds] 05:29:23 oleo [~oleo@xdsl-84-44-208-226.netcologne.de] has joined #sbcl 05:34:59 I'll have to think on this more. It seems to be working though - I made the number_of_values() function not virtual and now smart_ptr and multiple_values are no longer polymorphic. My Common Lisp compiler is compiling itself just fine. I don't know why I thought a virtual function was a good idea - I wish I'd stored a copy of our original conversation. 05:36:03 The smart_ptr is now 8 bytes (x86-64 bit) and no longer needs a vtable. This should make it easier to work with for varargs. 05:36:26 *drmeister* drags himself off to bed 05:54:23 -!- oleo [~oleo@xdsl-84-44-208-226.netcologne.de] has quit [Quit: Leaving] 06:44:50 -!- drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has quit [Remote host closed the connection] 07:33:26 prxq [~mommer@x2f695d8.dyn.telefonica.de] has joined #sbcl 08:33:10 -!- attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has quit [Quit: Leaving.] 08:33:44 drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has joined #sbcl 08:38:45 -!- drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has quit [Ping timeout: 272 seconds] 08:58:33 -!- ASau` [~user@p54AFFD35.dip0.t-ipconnect.de] has quit [Remote host closed the connection] 09:00:27 ASau` [~user@p54AFFD35.dip0.t-ipconnect.de] has joined #sbcl 09:13:05 attila_lendvai [~attila_le@5.251.140.27] has joined #sbcl 09:13:05 -!- attila_lendvai [~attila_le@5.251.140.27] has quit [Changing host] 09:13:05 attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has joined #sbcl 09:23:40 tcr1 [~tcr@a88-113-3-60.elisa-laajakaista.fi] has joined #sbcl 09:44:37 -!- attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has quit [Ping timeout: 248 seconds] 09:44:53 attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has joined #sbcl 09:53:37 michael_alex [~michael@117.22.94.38] has joined #sbcl 09:55:43 -!- michael_alex [~michael@117.22.94.38] has quit [Max SendQ exceeded] 09:56:26 michael_alex [~michael@117.22.94.38] has joined #sbcl 10:22:34 drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has joined #sbcl 10:27:03 -!- drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has quit [Ping timeout: 272 seconds] 10:28:43 -!- echo-area [~user@182.92.247.2] has quit [Remote host closed the connection] 10:30:28 -!- kludge` [~comet@unaffiliated/espiral] has quit [Ping timeout: 264 seconds] 10:33:42 kludge` [~comet@unaffiliated/espiral] has joined #sbcl 10:34:34 stassats [~stassats@wikipedia/stassats] has joined #sbcl 10:50:08 -!- Vivitron [~Vivitron@c-50-172-44-193.hsd1.il.comcast.net] has quit [Ping timeout: 245 seconds] 11:29:45 -!- stassats [~stassats@wikipedia/stassats] has quit [Ping timeout: 272 seconds] 11:37:12 -!- kludge` [~comet@unaffiliated/espiral] has quit [Remote host closed the connection] 11:38:01 -!- tcr1 [~tcr@a88-113-3-60.elisa-laajakaista.fi] has quit [Quit: Leaving.] 11:42:28 kludge` [~comet@unaffiliated/espiral] has joined #sbcl 11:49:07 tcr [~tcr@a88-113-3-60.elisa-laajakaista.fi] has joined #sbcl 12:11:14 drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has joined #sbcl 12:15:05 hlavaty [~user@friedrichstrasse.knowledgetools.de] has joined #sbcl 12:15:34 -!- drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has quit [Ping timeout: 248 seconds] 12:23:26 -!- |3b| [bbb@2600:3c00::f03c:91ff:fedf:5b65] has quit [Ping timeout: 240 seconds] 12:24:28 |3b| [bbb@2600:3c00::f03c:91ff:fedf:5b65] has joined #sbcl 12:30:54 eudoxia [~eudoxia@r179-24-19-221.dialup.adsl.anteldata.net.uy] has joined #sbcl 12:45:24 drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has joined #sbcl 12:45:24 -!- drmeister [~drmeister@pool-173-59-25-58.phlapa.fios.verizon.net] has quit [Remote host closed the connection] 12:50:18 echo-area [~user@114.254.102.124] has joined #sbcl 12:54:20 -!- attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has quit [Quit: Leaving.] 13:03:51 -!- ASau` is now known as ASau 13:20:45 tcr1 [~tcr@a88-113-3-60.elisa-laajakaista.fi] has joined #sbcl 13:22:23 -!- tcr [~tcr@a88-113-3-60.elisa-laajakaista.fi] has quit [Ping timeout: 272 seconds] 13:30:20 -!- tcr1 [~tcr@a88-113-3-60.elisa-laajakaista.fi] has quit [Quit: Leaving.] 13:45:29 attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has joined #sbcl 13:57:21 teggi [~teggi@123.21.198.146] has joined #sbcl 14:08:43 -!- segv- [~mb@95-91-240-218-dynip.superkabel.de] has quit [Ping timeout: 272 seconds] 14:34:35 -!- ASau [~user@p54AFFD35.dip0.t-ipconnect.de] has quit [Ping timeout: 272 seconds] 14:37:17 ASau [~user@p54AFFD35.dip0.t-ipconnect.de] has joined #sbcl 14:38:49 oleo [~oleo@xdsl-78-35-182-95.netcologne.de] has joined #sbcl 14:40:21 stassats [~stassats@wikipedia/stassats] has joined #sbcl 14:54:05 drmeister [~drmeister@155.247.96.196] has joined #sbcl 15:00:45 -!- eudoxia [~eudoxia@r179-24-19-221.dialup.adsl.anteldata.net.uy] has quit [Quit: Leaving] 15:02:59 eudoxia [~eudoxia@r179-24-19-221.dialup.adsl.anteldata.net.uy] has joined #sbcl 15:10:09 -!- drmeister [~drmeister@155.247.96.196] has quit [Ping timeout: 272 seconds] 15:16:56 tcr [~tcr@193.185.31.190] has joined #sbcl 15:23:26 drmeister [~drmeister@155.247.96.196] has joined #sbcl 15:33:09 -!- drmeister [~drmeister@155.247.96.196] has quit [Remote host closed the connection] 15:34:18 drmeister [~drmeister@155.247.96.196] has joined #sbcl 15:37:31 -!- tcr [~tcr@193.185.31.190] has quit [Ping timeout: 252 seconds] 15:43:15 -!- eudoxia [~eudoxia@r179-24-19-221.dialup.adsl.anteldata.net.uy] has quit [Ping timeout: 246 seconds] 15:43:18 -!- drmeister [~drmeister@155.247.96.196] has quit [Remote host closed the connection] 15:45:37 -!- attila_lendvai [~attila_le@unaffiliated/attila-lendvai/x-3126965] has quit [Quit: Leaving.] 15:45:55 drmeister [~drmeister@155.247.96.196] has joined #sbcl 15:47:13 edgar-rft [~GOD@HSI-KBW-109-193-013-113.hsi7.kabel-badenwuerttemberg.de] has joined #sbcl 15:49:57 -!- teggi [~teggi@123.21.198.146] has quit [Quit: Leaving...] 16:04:20 eudoxia [~eudoxia@r179-24-19-221.dialup.adsl.anteldata.net.uy] has joined #sbcl 16:18:23 -!- edgar-rft [~GOD@HSI-KBW-109-193-013-113.hsi7.kabel-badenwuerttemberg.de] has quit [Read error: Operation timed out] 16:20:18 segv- [~mb@95-91-240-218-dynip.superkabel.de] has joined #sbcl 16:57:36 -!- drmeister [~drmeister@155.247.96.196] has quit [Remote host closed the connection] 17:01:16 -!- eudoxia [~eudoxia@r179-24-19-221.dialup.adsl.anteldata.net.uy] has quit [Read error: Connection reset by peer] 17:01:30 eudoxia [~eudoxia@r186-52-26-101.dialup.adsl.anteldata.net.uy] has joined #sbcl 17:09:27 yacks [~py@103.6.159.103] has joined #sbcl 17:40:07 -!- michael_alex [~michael@117.22.94.38] has quit [Remote host closed the connection] 17:50:53 -!- eudoxia [~eudoxia@r186-52-26-101.dialup.adsl.anteldata.net.uy] has quit [Remote host closed the connection] 17:58:17 -!- stassats [~stassats@wikipedia/stassats] has quit [Remote host closed the connection] 18:06:31 eudoxia [~eudoxia@r186-52-26-101.dialup.adsl.anteldata.net.uy] has joined #sbcl 18:07:19 -!- eudoxia [~eudoxia@r186-52-26-101.dialup.adsl.anteldata.net.uy] has quit [Read error: Connection reset by peer] 18:58:31 drmeister [~drmeister@155.247.96.196] has joined #sbcl 19:02:38 -!- drmeister [~drmeister@155.247.96.196] has quit [Ping timeout: 245 seconds] 19:04:44 sdemarre [~serge@91.180.110.190] has joined #sbcl 19:05:54 -!- kludge` [~comet@unaffiliated/espiral] has quit [Quit: leaving] 19:06:48 kludge` [~comet@unaffiliated/espiral] has joined #sbcl 19:06:58 -!- kludge` [~comet@unaffiliated/espiral] has quit [Client Quit] 19:07:43 kludge` [~comet@unaffiliated/espiral] has joined #sbcl 19:18:39 -!- sdemarre [~serge@91.180.110.190] has quit [Read error: Operation timed out] 19:38:51 edgar-rft [~GOD@HSI-KBW-109-193-013-113.hsi7.kabel-badenwuerttemberg.de] has joined #sbcl 19:52:54 -!- samskulls [~user@S0106001111de1fc8.cg.shawcable.net] has left #sbcl 19:55:00 -!- fikusz [~fikusz@catv-89-132-137-62.catv.broadband.hu] has quit [Read error: Operation timed out] 20:01:12 fikusz [~fikusz@catv-89-132-137-62.catv.broadband.hu] has joined #sbcl 20:23:55 eudoxia [~eudoxia@r186-54-249-13.dialup.adsl.anteldata.net.uy] has joined #sbcl 20:41:15 -!- oleo [~oleo@xdsl-78-35-182-95.netcologne.de] has quit [Ping timeout: 245 seconds] 20:42:40 oleo [~oleo@xdsl-78-35-150-20.netcologne.de] has joined #sbcl 20:58:19 drmeister [~drmeister@155.247.96.196] has joined #sbcl 21:02:30 -!- drmeister [~drmeister@155.247.96.196] has quit [Ping timeout: 245 seconds] 21:14:34 -!- eudoxia [~eudoxia@r186-54-249-13.dialup.adsl.anteldata.net.uy] has quit [Ping timeout: 246 seconds] 21:14:47 scymtym_ [~user@ip-5-147-115-29.unitymediagroup.de] has joined #sbcl 21:33:25 drmeister [~drmeister@155.247.96.196] has joined #sbcl 21:34:19 -!- ASau [~user@p54AFFD35.dip0.t-ipconnect.de] has quit [Remote host closed the connection] 21:36:36 -!- danlentz [~danlentz@c-68-37-70-235.hsd1.nj.comcast.net] has quit [Remote host closed the connection] 21:36:52 ASau [~user@p54AFFD35.dip0.t-ipconnect.de] has joined #sbcl 21:37:08 danlentz [~danlentz@c-68-37-70-235.hsd1.nj.comcast.net] has joined #sbcl 21:38:22 sdemarre [~serge@91.180.110.190] has joined #sbcl 21:40:00 -!- danlentz [~danlentz@c-68-37-70-235.hsd1.nj.comcast.net] has quit [Remote host closed the connection] 21:40:25 danlentz [~danlentz@c-68-37-70-235.hsd1.nj.comcast.net] has joined #sbcl 21:46:29 running tests on the current frozen code on ubuntu 32-bit i get the following failure. Not sure it's a known case " Failure: threads.impure.lisp / FP-MODE-INHERITANCE-THREADS" 21:49:41 -!- danlentz [~danlentz@c-68-37-70-235.hsd1.nj.comcast.net] has quit [Remote host closed the connection] 21:50:05 danlentz [~danlentz@c-68-37-70-235.hsd1.nj.comcast.net] has joined #sbcl 21:51:45 -!- daimrod [daimrod@sbrk.org] has quit [Remote host closed the connection] 21:51:55 daimrod [daimrod@sbrk.org] has joined #sbcl 21:53:15 -!- prxq [~mommer@x2f695d8.dyn.telefonica.de] has quit [Quit: Leaving] 22:02:21 nicdev: hm, that's a new test, but it's a bit surprising to me that it fails 22:03:29 how does it fail? 22:05:08 ASau` [~user@p54AFFD70.dip0.t-ipconnect.de] has joined #sbcl 22:08:23 -!- ASau [~user@p54AFFD35.dip0.t-ipconnect.de] has quit [Ping timeout: 252 seconds] 22:08:25 -!- sdemarre [~serge@91.180.110.190] has quit [Ping timeout: 272 seconds] 22:16:56 -!- Guest80403 is now known as reb 22:28:22 -!- ASau` is now known as ASau 22:32:54 -!- drmeister [~drmeister@155.247.96.196] has quit [Remote host closed the connection] 23:01:20 drmeister [~drmeister@155.247.96.196] has joined #sbcl 23:03:40 -!- drmeister [~drmeister@155.247.96.196] has quit [Remote host closed the connection] 23:10:01 samskulls [~user@S0106001111de1fc8.cg.shawcable.net] has joined #sbcl 23:22:44 Hello. I have a minor question about the number of instruction to dereference elements of certain things. Suppose I wrote (defstruct a (x 0.0d0 :type double-float) (y 0.0d0 :type double-float)) and an alternative (make-array 2 :element-type double-float :initial-contents '(0.0d0 0.0d0)) Is it more or less instructions to say (a-x instance) or (aref instance 0) ? 23:23:42 I'm debating whether or not to represents array-like things as arrays or as structures since I need to do a lot of accessing with them and want to keep the code symbolically oriented for human readability. I know I can use a symbol-macro or something, but haven't wandered down that path yet. 23:24:22 But, I also would like performance out of the system, if I can help it. 23:24:26 thank you! 23:39:16 psilord: have you tried disassembling to find out? 23:41:29 objdump -D :P 23:44:43 Not yet, I was attempting to try it out. I'm not yet in tune with making CL code faster using type declarations. I was interested in seeing if someone happened to know off the top of their head that accessing elements using one method is always worse than another no matter what type information I supply, that sort of thing.... 23:46:29 i think they're about the same performance but i don't know for sure, and disassembly would tell you 23:46:46 That's a fair answer. 23:46:58 I'll see what I find when I disassemble it all. 23:47:46 you could just disassemble the accessing parts.