*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.52.1> has quit IRC | 08:00 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.160.30> has joined #libre-soc | 08:00 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.160.30> has quit IRC | 08:43 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.56.157> has joined #libre-soc | 08:45 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.56.157> has quit IRC | 08:50 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.170.168> has joined #libre-soc | 08:50 | |
*** ghostmansd <ghostmansd!~ghostmans@91.205.168.237> has joined #libre-soc | 11:01 | |
lkcl | ghostmansd, ack :) | 11:08 |
---|---|---|
lkcl | yeah i like the matcher concept too | 11:09 |
lkcl | you probably worked out by now that the "depth" parameter was a known-calculable quantity. | 11:10 |
lkcl | * db: depth=0 | 11:10 |
lkcl | * instructions: depth=1 | 11:10 |
lkcl | * records: depth=2 | 11:10 |
lkcl | * record-fields: depth=3 | 11:10 |
lkcl | * ... | 11:10 |
lkcl | and that can obviously be hard-coded into the.... the.... visitors. | 11:11 |
lkcl | > Is the whole problem that you don't want visitors to be passed to Whatever.visit() | 11:13 |
lkcl | (i'll do a full reply on the bugreport) | 11:13 |
lkcl | not quite: they should indeed... *but not in a child-loop* | 11:14 |
lkcl | the child-looping (full recursion) should be an *entirely* separate "thing", just like it is in python 2.7 ast.py | 11:15 |
lkcl | and just like in ast.py, there is a base-class (actually, calling it AST would do fine, but "InsnDB" or something is just as fine, it makes no odds) | 11:17 |
lkcl | that *everything* - the entire Instruction Database - absolutely every single class - inherits from | 11:17 |
lkcl | this allows the walker-function to perform the "fields()" introspection | 11:18 |
lkcl | otherwise | 11:18 |
lkcl | you have to have this: | 11:18 |
lkcl | class Opcode: | 11:19 |
lkcl | .... | 11:19 |
lkcl | def visitor_walker_function(self): | 11:19 |
lkcl | for field in self.opcode_fields: | 11:20 |
lkcl | yield field | 11:20 |
lkcl | and | 11:20 |
lkcl | class Record: | 11:20 |
lkcl | .... | 11:20 |
lkcl | def visitor_walker_function(self): | 11:20 |
lkcl | yield name | 11:20 |
lkcl | yield section | 11:20 |
lkcl | yield ppc | 11:20 |
lkcl | for field in self.fields: | 11:21 |
lkcl | yield field | 11:21 |
lkcl | yield mdwn | 11:21 |
lkcl | etc. etc. | 11:21 |
lkcl | that is a *frickin* lot of work.... | 11:21 |
lkcl | .... *all* replaceable with *one* function that is only about 8 lines long. | 11:21 |
lkcl | > I don't want any of this "if isinstance" crap, at all. | 11:27 |
lkcl | please don't make the mistake of thinking that use of "insinstance" is "crap", the alternatives are much worse: forcing the introduction of a hidden property/function/object and using "hasattr" instead, which is really fragile and counter-intuitive | 11:28 |
lkcl | using "isinstance()" is pretty normal | 11:28 |
ghostmansd[m] | I'm really tired of this. | 12:17 |
ghostmansd[m] | Short reply on yield: it's not about walking. Please read how context manager works. | 12:18 |
ghostmansd[m] | There can be no more yields than one. | 12:18 |
lkcl | ok then we need to drop contextmanager | 12:18 |
ghostmansd[m] | yield simply marks "before" and "after". | 12:18 |
ghostmansd[m] | Why? | 12:18 |
lkcl | which insndb class has more than one child-to-be-walked? it's.... Operand, isn't it? | 12:19 |
lkcl | that has two things: static_operands and dynamic_operands, doesn't it? | 12:19 |
lkcl | the "before" needs to be called *on static_operands* followed by an "after" | 12:20 |
lkcl | and then | 12:20 |
lkcl | "before" needs to be called on dynamic_operands followed by a *separate* after | 12:20 |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.170.168> has quit IRC | 12:20 | |
lkcl | remember that this is complex enough that i can't completely grasp it entirely, so we both have to be very patient. | 12:21 |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.168.198> has joined #libre-soc | 12:21 | |
lkcl | it's also worth getting right because we'll be basing pretty much the entirety of the code on it (!) | 12:21 |
lkcl | let me think through what you wrote here https://bugs.libre-soc.org/show_bug.cgi?id=1094#c63 | 12:23 |
*** ghostmansd <ghostmansd!~ghostmans@91.205.168.237> has quit IRC | 12:23 | |
lkcl | in particular: how do you differentiate a field that is a str (or SelectableInt, or Enum) | 12:24 |
lkcl | such that the use of dataclasses.fields() in iter_child_nodes() can distinguish them? | 12:26 |
lkcl | iter_child_nodes _isn't_ the public API btw. it's a private function. | 12:26 |
lkcl | ok i'll write some more questions, i do appreciate i'm not replying to acknowledge what you're trying to say. | 12:28 |
lkcl | right. | 12:28 |
lkcl | yes. | 12:28 |
ghostmansd[m] | I suggest this: | 12:31 |
ghostmansd[m] | 1. Visitor just have stub __call__ method with "pass". But yes, I think this should be context manager, because it separates before/on/after. | 12:31 |
ghostmansd[m] | 2. I can make other fields be walkable, OK. Beware they are low-level. | 12:31 |
ghostmansd[m] | Is it sufficient to finally stop it? | 12:31 |
lkcl | if users are not aware that they are low-level, they should not be writing code. like a SQL developer, they *have* to know the structure of the TABLEs that they create, not just the data! | 12:32 |
ghostmansd[m] | I want to start writing something practical. | 12:32 |
ghostmansd[m] | No they don't need to be aware of how CSVs are layed out. | 12:32 |
ghostmansd[m] | This is not some damn SQL. The analogy is incorrect. | 12:33 |
lkcl | true but they do need to know that db contains insns, insns contain operands, operands contain fields etc. etc. | 12:33 |
ghostmansd[m] | Yes but they can have it in a good form. cf. class Extra. | 12:33 |
lkcl | if they don't know that, they should not be let loose on the code. | 12:34 |
ghostmansd[m] | Why should the binutils hacker know about our CSVs? | 12:35 |
ghostmansd[m] | In details, at least. | 12:35 |
lkcl | not the CSVs, the classes and their inheritance / member structure | 12:35 |
ghostmansd[m] | They will want to see the generator and could have a data nicely wrapped. | 12:35 |
ghostmansd[m] | That's not what I'm talking about. | 12:35 |
ghostmansd[m] | Again, see class Extra. | 12:35 |
ghostmansd[m] | And then compare it to fields we have in Record right now. | 12:36 |
ghostmansd[m] | Notice the difference. | 12:36 |
lkcl | gimme 1 sec... | 12:36 |
ghostmansd[m] | And then ask yourself what's simpler to use. | 12:36 |
ghostmansd[m] | Extra has all info incorporated. | 12:36 |
ghostmansd[m] | And that's simple to use. | 12:36 |
ghostmansd[m] | Yes I can do it on db init. | 12:36 |
* lkcl thinking... | 12:37 | |
ghostmansd[m] | But there's no task and budget for it. Nor time. | 12:37 |
lkcl | ah! | 12:37 |
lkcl | arse! | 12:37 |
ghostmansd[m] | In fact, even this task lacks the budget. | 12:37 |
lkcl | i got totally confused | 12:37 |
lkcl | no it's ok, i'm really sorry, i misread | 12:37 |
ghostmansd[m] | My point is, I can totally walk around fields via dataclasses.fields. | 12:37 |
lkcl | the "yield node" had me totally confused | 12:38 |
ghostmansd[m] | It's just that the data is way too level. | 12:38 |
ghostmansd[m] | too low-level | 12:38 |
ghostmansd[m] | yield is just a context switch | 12:38 |
ghostmansd[m] | You keep thinking it's a walking, but it's not. | 12:39 |
lkcl | there's two issues. the Visitors (ExtrasVisitor) is perfect. i confused the use of "yield", thinking it was still part of visitor-walking. | 12:39 |
lkcl | really sorry - i'm with you now, and it's perfect. | 12:39 |
ghostmansd[m] | That's fin3 | 12:39 |
ghostmansd[m] | I was confused too when I saw the manager | 12:39 |
ghostmansd[m] | But it's cool, especially for printing C structa | 12:40 |
ghostmansd[m] | *structs | 12:40 |
ghostmansd[m] | Sorry, typing from phone | 12:40 |
lkcl | yes. | 12:40 |
lkcl | :) | 12:40 |
lkcl | i do that - just not with IRC :) | 12:40 |
ghostmansd[m] | And printing these opening braces, then contents, then closing braces | 12:40 |
ghostmansd[m] | So that's why I like context managers | 12:40 |
lkcl | it'll work really well, yes | 12:41 |
lkcl | polish-notation you do the "yield node" before the prints | 12:41 |
ghostmansd[m] | Yes | 12:41 |
lkcl | reverse-polish notation you do the "yield node" last | 12:41 |
lkcl | (something like that) | 12:41 |
ghostmansd[m] | everything before yield is __enter__ | 12:41 |
ghostmansd[m] | Everything later is __exit__ | 12:42 |
lkcl | i was totally getting confused by thinking that "yield node" was the *database-walking* (IVisitable) rather than "actions" (IVisitor) | 12:43 |
lkcl | so sorry | 12:43 |
ghostmansd[m] | That's why I asked you to read comments | 12:44 |
lkcl | ok so this just leaves the recursive-walking, which is not something that is a public part of the API. we *never* expect users to override it | 12:44 |
ghostmansd[m] | I generally don't post the bullshit without giving at least minor context. | 12:44 |
lkcl | i am having difficulty *understanding*, it's not so much the reading :) | 12:45 |
ghostmansd[m] | What do you mean by recursive walking here? | 12:45 |
ghostmansd[m] | The hierarchy is linear. | 12:45 |
ghostmansd[m] | We're not expected to visit some nodes again. | 12:45 |
lkcl | no definitely not! | 12:45 |
lkcl | recursive-descent. tree. depth-first, breadth-first. | 12:46 |
lkcl | trying to find the right words here | 12:46 |
lkcl | ah. doh. | 12:46 |
lkcl | hierarchy-walking. | 12:46 |
lkcl | (tree-hierarchy-walking is often done recursively, i used the wrong word, sorry). | 12:47 |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.168.198> has quit IRC | 12:49 | |
lkcl | i'll sort out budgets - it might not specifically be under this particular one, but increased elsewhere ok? | 12:51 |
lkcl | programmerjake, i meant: i saw a couple of days ago that you posted a "CI report" and tracked down the diff that caused the error. | 12:52 |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.53.36> has joined #libre-soc | 12:53 | |
lkcl | except the openpowerbot wasn't running at the time so it wasn't recorded | 12:53 |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.53.36> has quit IRC | 12:55 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.162.209> has joined #libre-soc | 12:55 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.162.209> has quit IRC | 13:03 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.56.218> has joined #libre-soc | 13:03 | |
ghostmansd[m] | Ok, so, summary | 13:03 |
ghostmansd[m] | A simple visitor base class with one __call__ and node argument; the caller is expected to check instance | 13:04 |
ghostmansd[m] | Next, for fields. These either need to be refactored, or we don't care that fields are low-level. | 13:06 |
lkcl | > A simple visitor base class ... | 13:07 |
lkcl | yes. matching can be a pre-filter on the (now separate) tree-walk | 13:08 |
lkcl | (or just use "if node.name == self.name" for really simple ones) | 13:08 |
lkcl | > Next, for fields.... | 13:09 |
ghostmansd[m] | There's no "pre-filter". There must be either something collected (records), or the filtering should be filtered upon visiting. | 13:09 |
ghostmansd[m] | Or at least upon walking, if we pass filter to walker. | 13:09 |
lkcl | well... what's nice about the tree-walk "yield" is that it is possible to do the filtering "on-the-fly" | 13:10 |
ghostmansd[m] | Again with this isinstance? | 13:10 |
lkcl | it's not aabsolutely strictly necessary to store the entire "wanted" set in a temporary | 13:10 |
ghostmansd[m] | Because nodes on walk can be of different types. | 13:11 |
lkcl | i'd expect some people to detect the node-type in the filter function, there | 13:11 |
lkcl | it's up to them what to choose | 13:11 |
ghostmansd[m] | In walk(), it's the filter callable that must check for node types. | 13:12 |
lkcl | ahhh | 13:12 |
ghostmansd[m] | If this is the place you want it. | 13:12 |
lkcl | okaaay | 13:12 |
lkcl | yes that works | 13:12 |
ghostmansd[m] | Yes but ugly. | 13:12 |
ghostmansd[m] | I'd rather expect somebody to collect the relevant level entries. | 13:12 |
ghostmansd[m] | e.g. db.subnodes only | 13:12 |
ghostmansd[m] | then filter them... | 13:13 |
lkcl | for simple things i'd expect to just use the "if node.name == self.name" trick | 13:13 |
ghostmansd[m] | as they like, without special magic arguments | 13:13 |
ghostmansd[m] | Again: this trick only works as long as you check instance type. | 13:13 |
lkcl | yes. any info they need it should be passed in. | 13:13 |
ghostmansd[m] | You cannot just take an arbitrary node and check for its name. | 13:13 |
lkcl | well, you *can* have *two* visitor-functions (def Record(self, node) and def Operand(self, node)) | 13:14 |
ghostmansd[m] | Damn | 13:14 |
ghostmansd[m] | We're walking in circles | 13:14 |
lkcl | and in Record() store node as self.__current_record = node | 13:14 |
ghostmansd[m] | That's exactly what I did | 13:14 |
lkcl | then use that in def Operand(...) | 13:15 |
ghostmansd[m] | And you wrote that you want isinstance instead | 13:15 |
ghostmansd[m] | You must be fucking kidding me | 13:15 |
ghostmansd[m] | Please stop doing this | 13:15 |
lkcl | except that - and i apologise for this - that was when the visitor-walking was still part of the API | 13:15 |
ghostmansd[m] | No walking is different from visiting | 13:16 |
lkcl | ah rats i've used the wrong word "visitor-walking" there, haven't i. | 13:16 |
ghostmansd[m] | Again: please finally read the code. The subnodes are separate. The visitor handlers are separate. | 13:16 |
ghostmansd[m] | The code follows AST exactly, except for managers. | 13:18 |
ghostmansd[m] | Ok, I'll post what I suggest, gimme some minutes. | 13:18 |
lkcl | Extra inherits from Node... Record inherits from Node... | 13:19 |
lkcl | oof i've been sitting down for too long. | 13:19 |
lkcl | please allow me to continue off-IRC? i allocated some budget, am just upping it | 13:20 |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has joined #libre-soc | 13:28 | |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has quit IRC | 13:31 | |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has joined #libre-soc | 13:32 | |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has quit IRC | 13:33 | |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has joined #libre-soc | 13:33 | |
ghostmansd | lkcl, option 1: https://pastebin.com/YxBtsCR3 | 13:33 |
ghostmansd | option 2: https://pastebin.com/91SuMez3 | 13:34 |
ghostmansd | basically the same, but in option 2 we have a separate property for nodes, called subnodes. It allows to affect what's returned. | 13:35 |
ghostmansd | From visitor only 1 thing is left: the fact it's callable and the __call__ is expected to be a context manager. | 13:36 |
ghostmansd | For 1094, the budget is unfair. This should be split between 3 people. | 13:37 |
ghostmansd | Jacob deserves some credit for his idea on context manager. | 13:37 |
ghostmansd | This depends a bit on whether binutils rewriting is part of this task, though. I guess yes, considering the budget. | 13:40 |
ghostmansd | I think option 1 is better, because it's more generic. After all, if somebody want's a high-level stuff, they will call methods anyway. | 13:45 |
ghostmansd | (option 1 lacks is instance, but you got the idea) | 13:45 |
ghostmansd | Actually I think option 2 is kinda better because not everything is a dataclass in insndb... | 13:46 |
ghostmansd | OK let's kinda do hybrid. Thing that's a dataclass will have subnodes implemented in terms of dataclasses.fields. | 13:47 |
lkcl | > not everything is a dataclass in insndb | 14:20 |
lkcl | indeed! | 14:20 |
lkcl | (that's why the "isinstance(node, AST)" is there in python 2.7 ast.py, for the detection. | 14:21 |
lkcl | > Jacob deserves some credit for his idea | 14:22 |
lkcl | done | 14:22 |
lkcl | i just want to check if Node has a def subnodes(self): pass, i think it does, doesn't it... 1 sec... | 14:22 |
ghostmansd | > done | 14:23 |
lkcl | ah - yield from () - okaay | 14:23 |
ghostmansd | not done, you forgot another person :-) | 14:23 |
lkcl | i'm fine, i have plenty from the ISA grant | 14:24 |
lkcl | so always having a "def subnodes()" even when it returns (), you can skip the "if isinstance(node, Node):" thing | 14:24 |
lkcl | that just leaves "non-dataclass" things, and... ehmm... ehmehmehm... | 14:25 |
ghostmansd | check new commits :-) | 14:25 |
ghostmansd | ah wait, not there yet | 14:25 |
lkcl | ehm... yes :) 17 hrs ago https://git.libre-soc.org/?p=openpower-isa.git;a=summary | 14:26 |
lkcl | "with visitor(node=node):" - this triggers the "begin/node/end" on the node, calling the visitor function | 14:30 |
ghostmansd | done | 14:30 |
lkcl | (which will call def Record() or def Operand() etc.) | 14:30 |
lkcl | ack, got it | 14:30 |
ghostmansd | hm, something strange with commit name | 14:31 |
ghostmansd | but OK | 14:31 |
lkcl | pffh :) | 14:31 |
ghostmansd | note the Dataclass class, not yet used | 14:31 |
ghostmansd | this can be inherited by stuff like Record, Extra or other dataclass-based | 14:31 |
ghostmansd | so they can have the same subnodes() method | 14:32 |
lkcl | like it | 14:32 |
lkcl | holy cow this is powerful | 14:32 |
ghostmansd | I cannot use the Dataclass yet, because some fields are not Node-based... | 14:33 |
lkcl | yehyeh | 14:33 |
ghostmansd | and also are too low-level | 14:33 |
ghostmansd | but this is doable | 14:33 |
ghostmansd | Perhaps we can just make all fields to be Nodes | 14:34 |
lkcl | so how would e.g. "class Instruction(str): ..." be handled? | 14:34 |
lkcl | yes that's the idea | 14:34 |
lkcl | except for str int Enum | 14:34 |
ghostmansd | Don't look at local class Istruction in db | 14:34 |
ghostmansd | it's for other purpose | 14:34 |
ghostmansd | 1 sec... | 14:34 |
lkcl | ok maybe Enum can inherit from Node | 14:34 |
ghostmansd | https://git.libre-soc.org/?p=openpower-isa.git;a=blob;f=src/openpower/insndb/db.py;h=2fce21b158efcc88b1ad990b167a9f551160beef;hb=182ff5a3950fc7db7de8b5c4d95549879e516cea#l126 | 14:35 |
ghostmansd | cf line 126 | 14:35 |
lkcl | Instruction and SVP64Instruction aren't going to be part of walking i take it | 14:35 |
lkcl | 126... | 14:35 |
ghostmansd | I should have called this class CLIInstructionArgument | 14:35 |
ghostmansd | or like this | 14:35 |
lkcl | ahh ok | 14:35 |
ghostmansd | misnomer | 14:35 |
lkcl | the Visitors are mentally short. | 14:36 |
lkcl | awesome | 14:36 |
lkcl | let me find a db-class... | 14:37 |
ghostmansd | Database currently yields all its subnodes as `yield from self` | 14:37 |
ghostmansd | and `__iter__` is `yield from self.__db` | 14:37 |
ghostmansd | 1 sec | 14:37 |
lkcl | not class Opcode, because it has value: Value and mask:Mask, i would expect those to inherit from Node... | 14:38 |
ghostmansd | I think opcode should be inherited, yes | 14:38 |
lkcl | ah! PPCRecord | 14:38 |
lkcl | comment: str | 14:38 |
lkcl | unofficial: bool = False | 14:39 |
ghostmansd | mask and value perhaps too, not sure if we need to pass these too | 14:39 |
ghostmansd | pass -> visit | 14:39 |
lkcl | how will the visit() function spot that PPCRecord.comment is a str yet still "yield" it? | 14:39 |
ghostmansd | bool is non-inheritable, and with enums there are... hm... complications | 14:39 |
ghostmansd | That's why there are custom subnodes for now in some dataclasses :-) | 14:40 |
ghostmansd | but with str/bool/whatever-else it's simple | 14:40 |
lkcl | indeed. this is why pyomo has a list of "builtin" nodes | 14:40 |
ghostmansd | we can just have Nodes-based stuff there instead | 14:40 |
ghostmansd | comment: String | 14:42 |
ghostmansd | class String(str, Node): pass | 14:42 |
lkcl | if using hasattr(node, "subnodes") - or "subnodes = getattr(node, 'subnodes', None)" or try/catch | 14:42 |
ghostmansd | yes, this can be the alternative | 14:42 |
lkcl | it seems to be pushing things a lot, just to avoid using hasattr/getattr/isinstance | 14:43 |
ghostmansd | the class-based approach has 1 pro: if we ever need something from generic Node class, this will be propagated to all descendants | 14:43 |
lkcl | btw do you know the difference between "type(node) == Node" and "isinstance(node, 'Node')? | 14:43 |
ghostmansd | currently we only have subnodes() method there, but perhaps there might be other stuff which quacks like duck | 14:44 |
lkcl | type is *fast* | 14:44 |
ghostmansd | yes, inehritance | 14:44 |
ghostmansd | type checks strictly | 14:44 |
ghostmansd | and Node will take derived classes into account | 14:44 |
lkcl | i "knew" that but temporarily forgot it :) | 14:44 |
ghostmansd | Node -> isinstance | 14:44 |
ghostmansd | actually there's yet another twist: issubclass(type(instance), SomeType) | 14:45 |
lkcl | ahhh. it works... but... blech :) | 14:45 |
ghostmansd | yeah] | 14:45 |
lkcl | i was so pissed when imputil was removed from python 3 | 14:45 |
ghostmansd | OK I think we can move towards making fields of insndb node-derived | 14:46 |
ghostmansd | fine with you? | 14:46 |
lkcl | yes fantastic | 14:46 |
ghostmansd | and then yield these fields despite their "is it high level enough" | 14:46 |
ghostmansd | because, well | 14:46 |
ghostmansd | if somebody needs high-level stuff | 14:46 |
ghostmansd | they catch the Record and call some of its methods | 14:46 |
ghostmansd | and this is just visiting what we have in database | 14:47 |
lkcl | i love the empty subnodes thing. | 14:47 |
ghostmansd | and in database we have exactly what we have in fields | 14:47 |
ghostmansd | this is 1:1 our CSVs and fields | 14:47 |
lkcl | btw: icing on the cake.... | 14:47 |
lkcl | the visit() function *should* - in theory - by using dataclasses.fields() - work if you pass in the *class* instead of the *instance*! | 14:48 |
lkcl | if you do "visit(Record, RecordVisitorLayout)" | 14:49 |
lkcl | it should work! | 14:49 |
lkcl | because dataclasses.fields() takes either an instance or a class | 14:49 |
lkcl | and that way it is possible to print out the *structure* of the entire database with the appropriate LayoutVisitor | 14:50 |
lkcl | i can foresee that being useful for e.g. header files | 14:51 |
lkcl | to create structs in c, based on the database layout | 14:51 |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has quit IRC | 14:53 | |
ghostmansd[m] | Yes it works, but: no values to be got | 14:56 |
ghostmansd[m] | Just the field types | 14:57 |
ghostmansd[m] | But yes, I even used dataclasses.fields in some classmethod | 14:57 |
lkcl | ok i need to get back to the spec - lots to do | 15:05 |
lkcl | including a rewrite of how PO9 is to be used | 15:05 |
ghostmansd[m] | Ack, thank you for discussion! | 15:11 |
ghostmansd[m] | This was a tough journey :-) | 15:12 |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has joined #libre-soc | 15:16 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.56.218> has quit IRC | 15:34 | |
*** ghostmansd <ghostmansd!~ghostmans@176.59.56.218> has quit IRC | 15:34 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.160.201> has joined #libre-soc | 15:35 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.160.201> has quit IRC | 15:41 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.162.122> has joined #libre-soc | 15:42 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 15:59 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has quit IRC | 16:08 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.162.122> has quit IRC | 16:22 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.164.86> has joined #libre-soc | 16:23 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 17:02 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@176.59.164.86> has quit IRC | 17:07 | |
lkcl | tell me about it... :) | 17:07 |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has quit IRC | 17:07 | |
*** ghostmansd[m] <ghostmansd[m]!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 17:07 | |
lkcl | it will be worth it, though, it's incredibly powerful | 17:08 |
lkcl | and also easy to appreciate why people get it mixed up | 17:08 |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 17:11 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has quit IRC | 17:16 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 17:21 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has quit IRC | 17:26 | |
*** yambo <yambo!~yambo@069-145-110-003.biz.spectrum.com> has quit IRC | 17:57 | |
programmerjake | lkcl: it was recorded, since irclog is not run by openpowerbot: | 18:09 |
programmerjake | https://libre-soc.org/irclog/%23libre-soc.2023-06-04.log.html#t2023-06-04T22:59:32 | 18:09 |
programmerjake | https://libre-soc.org/irclog/%23libre-soc.2023-06-05.log.html#t2023-06-05T09:22:06 | 18:09 |
programmerjake | note i posted a commit range and ghostmansd did all the work of figuring out what he broke | 18:10 |
*** yambo <yambo!~yambo@069-145-110-003.biz.spectrum.com> has joined #libre-soc | 18:10 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 18:23 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has quit IRC | 18:28 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has joined #libre-soc | 18:33 | |
*** ghostmansd <ghostmansd!~ghostmans@broadband-109-173-83-100.ip.moscow.rt.ru> has quit IRC | 18:38 | |
lkcl | programmerjake, ahh awesome. i added it https://bugs.libre-soc.org/show_bug.cgi?id=1115#c4 | 23:39 |
lkcl | and i think i know what's going on | 23:39 |
Generated by irclog2html.py 2.17.1 by Marius Gedminas - find it at https://mg.pov.lt/irclog2html/!