Skip to content

Commit

Permalink
Merge pull request #1 from sangshuduo/fix-typos
Browse files Browse the repository at this point in the history
fix: typos
  • Loading branch information
Chang-LeHung authored Oct 16, 2023
2 parents 10e1087 + 70376b9 commit 82fd2c8
Show file tree
Hide file tree
Showing 16 changed files with 30 additions and 30 deletions.
2 changes: 1 addition & 1 deletion docs/objects/08bytes.md
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ False

## 总结

在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 btyes 的拼接操作,否则效率会比较低。
在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 bytes 的拼接操作,否则效率会比较低。

---

Expand Down
2 changes: 1 addition & 1 deletion docs/objects/08bytes_upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ False

## 总结

在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 btyes 的拼接操作,否则效率会比较低。
在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 bytes 的拼接操作,否则效率会比较低。

---

Expand Down
6 changes: 3 additions & 3 deletions docs/obsy/04mro.md
Original file line number Diff line number Diff line change
Expand Up @@ -425,14 +425,14 @@ pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size)
*/
// 得到候选的类
candidate = PyTuple_GET_ITEM(cur_tuple, remain[i]);
// 查看各个基类的 mro 序列的尾部当中是否包含 condidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 condidate
// 查看各个基类的 mro 序列的尾部当中是否包含 candidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 candidate
for (j = 0; j < to_merge_size; j++) {
PyObject *j_lst = to_merge[j];
if (tail_contains(j_lst, remain[j], candidate))
// 如果尾部当中包含 condidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
// 如果尾部当中包含 candidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
goto skip; /* continue outer loop */
}
// 找到了则将 condidate 加入的返回的结果当中
// 找到了则将 candidate 加入的返回的结果当中
res = PyList_Append(acc, candidate);
if (res < 0)
goto out;
Expand Down
6 changes: 3 additions & 3 deletions docs/obsy/04mro_upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -425,14 +425,14 @@ pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size)
*/
// 得到候选的类
candidate = PyTuple_GET_ITEM(cur_tuple, remain[i]);
// 查看各个基类的 mro 序列的尾部当中是否包含 condidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 condidate
// 查看各个基类的 mro 序列的尾部当中是否包含 candidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 candidate
for (j = 0; j < to_merge_size; j++) {
PyObject *j_lst = to_merge[j];
if (tail_contains(j_lst, remain[j], candidate))
// 如果尾部当中包含 condidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
// 如果尾部当中包含 candidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
goto skip; /* continue outer loop */
}
// 找到了则将 condidate 加入的返回的结果当中
// 找到了则将 candidate 加入的返回的结果当中
res = PyList_Append(acc, candidate);
if (res < 0)
goto out;
Expand Down
4 changes: 2 additions & 2 deletions docs/pvm/02codeobject.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 深入理解 python 虚拟机:字节码灵魂——Code obejct
# 深入理解 python 虚拟机:字节码灵魂——Code object

在本篇文章当中主要给大家深入介绍在 cpython 当中非常重要的一个数据结构 code object! 在上一篇文章 [深入理解 python 虚拟机:pyc 文件结构](https://mp.weixin.qq.com/s?__biz=Mzg3ODgyNDgwNg==&mid=2247488040&idx=1&sn=665b5b6080d5ec7910f586b252281bcf&chksm=cf0c8e21f87b073748c82af61a5c7c9d73bca95e5b6558d50d1d5b1cc97e50c4a93d9daffcfa&token=1257007364&lang=zh_CN#rd) ,我们简单介绍了一下在 code object 当中有哪些字段以及这些字段的简单含义,在本篇文章当中将会举一些例子以便更加深入理解这些字段。

Expand Down Expand Up @@ -316,7 +316,7 @@ code

## 总结

在本篇文章当中主要分析了一些 code obejct 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。
在本篇文章当中主要分析了一些 code object 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。

---

Expand Down
4 changes: 2 additions & 2 deletions docs/pvm/02codeobject_upload.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 字节码灵魂——Code obejct
# 字节码灵魂——Code object

在本篇文章当中主要给大家深入介绍在 cpython 当中非常重要的一个数据结构 code object! 在上一篇文章 [深入理解 python 虚拟机:pyc 文件结构](https://mp.weixin.qq.com/s?__biz=Mzg3ODgyNDgwNg==&mid=2247488040&idx=1&sn=665b5b6080d5ec7910f586b252281bcf&chksm=cf0c8e21f87b073748c82af61a5c7c9d73bca95e5b6558d50d1d5b1cc97e50c4a93d9daffcfa&token=1257007364&lang=zh_CN#rd) ,我们简单介绍了一下在 code object 当中有哪些字段以及这些字段的简单含义,在本篇文章当中将会举一些例子以便更加深入理解这些字段。

Expand Down Expand Up @@ -316,7 +316,7 @@ code

## 总结

在本篇文章当中主要分析了一些 code obejct 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。
在本篇文章当中主要分析了一些 code object 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。

---

Expand Down
2 changes: 1 addition & 1 deletion docs/pvm/08debugger.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ python 官方的调试器为 pdb 这个是 python 标准库自带的,我们可
print("In return")
return self.dispatch_return(frame, arg)
if event == 'exception':
print("In execption")
print("In exception")
return self.dispatch_exception(frame, arg)
if event == 'c_call':
print("In c_call")
Expand Down
2 changes: 1 addition & 1 deletion objects/08bytes.md
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ False

## 总结

在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 btyes 的拼接操作,否则效率会比较低。
在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 bytes 的拼接操作,否则效率会比较低。

---

Expand Down
2 changes: 1 addition & 1 deletion objects/08bytes_upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -435,7 +435,7 @@ False

## 总结

在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 btyes 的拼接操作,否则效率会比较低。
在本篇文章当中主要给大家介绍了在 cpython 内部对于 bytes 的实现,重点介绍了 cpython 当中 PyBytesObject 的内存布局和创建 PyBytesObject 的函数,以及对于 bytes 对象的拼接细节和 cpython 内部单字节字符的缓冲池。在程序当中最好使用 join 操作进行 bytes 的拼接操作,否则效率会比较低。

---

Expand Down
6 changes: 3 additions & 3 deletions obsy/04mro.md
Original file line number Diff line number Diff line change
Expand Up @@ -425,14 +425,14 @@ pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size)
*/
// 得到候选的类
candidate = PyTuple_GET_ITEM(cur_tuple, remain[i]);
// 查看各个基类的 mro 序列的尾部当中是否包含 condidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 condidate
// 查看各个基类的 mro 序列的尾部当中是否包含 candidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 candidate
for (j = 0; j < to_merge_size; j++) {
PyObject *j_lst = to_merge[j];
if (tail_contains(j_lst, remain[j], candidate))
// 如果尾部当中包含 condidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
// 如果尾部当中包含 candidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
goto skip; /* continue outer loop */
}
// 找到了则将 condidate 加入的返回的结果当中
// 找到了则将 candidate 加入的返回的结果当中
res = PyList_Append(acc, candidate);
if (res < 0)
goto out;
Expand Down
6 changes: 3 additions & 3 deletions obsy/04mro_upload.md
Original file line number Diff line number Diff line change
Expand Up @@ -425,14 +425,14 @@ pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size)
*/
// 得到候选的类
candidate = PyTuple_GET_ITEM(cur_tuple, remain[i]);
// 查看各个基类的 mro 序列的尾部当中是否包含 condidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 condidate
// 查看各个基类的 mro 序列的尾部当中是否包含 candidate 尾部就是除去剩下的 mro 序列当中的第一个 剩下的类就是尾部当中含有的类 tail_contains 就是检查尾部当中是否包含 candidate
for (j = 0; j < to_merge_size; j++) {
PyObject *j_lst = to_merge[j];
if (tail_contains(j_lst, remain[j], candidate))
// 如果尾部当中包含 condidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
// 如果尾部当中包含 candidate 则说明当前的 candidate 不符合要求需要查看下一个 mro 序列的第一个类 看看是否符合要求 如果还不符合就需要找下一个 再进行重复操作
goto skip; /* continue outer loop */
}
// 找到了则将 condidate 加入的返回的结果当中
// 找到了则将 candidate 加入的返回的结果当中
res = PyList_Append(acc, candidate);
if (res < 0)
goto out;
Expand Down
4 changes: 2 additions & 2 deletions pvm/02codeobject.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 深入理解 python 虚拟机:字节码灵魂——Code obejct
# 深入理解 python 虚拟机:字节码灵魂——Code object

在本篇文章当中主要给大家深入介绍在 cpython 当中非常重要的一个数据结构 code object! 在上一篇文章 [深入理解 python 虚拟机:pyc 文件结构](https://mp.weixin.qq.com/s?__biz=Mzg3ODgyNDgwNg==&mid=2247488040&idx=1&sn=665b5b6080d5ec7910f586b252281bcf&chksm=cf0c8e21f87b073748c82af61a5c7c9d73bca95e5b6558d50d1d5b1cc97e50c4a93d9daffcfa&token=1257007364&lang=zh_CN#rd) ,我们简单介绍了一下在 code object 当中有哪些字段以及这些字段的简单含义,在本篇文章当中将会举一些例子以便更加深入理解这些字段。

Expand Down Expand Up @@ -316,7 +316,7 @@ code

## 总结

在本篇文章当中主要分析了一些 code obejct 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。
在本篇文章当中主要分析了一些 code object 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。

---

Expand Down
4 changes: 2 additions & 2 deletions pvm/02codeobject_upload.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# 深入理解 python 虚拟机:字节码灵魂——Code obejct
# 深入理解 python 虚拟机:字节码灵魂——Code object

在本篇文章当中主要给大家深入介绍在 cpython 当中非常重要的一个数据结构 code object! 在上一篇文章 [深入理解 python 虚拟机:pyc 文件结构](https://mp.weixin.qq.com/s?__biz=Mzg3ODgyNDgwNg==&mid=2247488040&idx=1&sn=665b5b6080d5ec7910f586b252281bcf&chksm=cf0c8e21f87b073748c82af61a5c7c9d73bca95e5b6558d50d1d5b1cc97e50c4a93d9daffcfa&token=1257007364&lang=zh_CN#rd) ,我们简单介绍了一下在 code object 当中有哪些字段以及这些字段的简单含义,在本篇文章当中将会举一些例子以便更加深入理解这些字段。

Expand Down Expand Up @@ -316,7 +316,7 @@ code

## 总结

在本篇文章当中主要分析了一些 code obejct 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。
在本篇文章当中主要分析了一些 code object 当中比较重要的字段,code object 是 cpython 虚拟机当中一个比较重要的数据结构,深入的去理解这里面的字段对于我们理解 python 虚拟机非常有帮助。

---

Expand Down
2 changes: 1 addition & 1 deletion pvm/08debugger.md
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ python 官方的调试器为 pdb 这个是 python 标准库自带的,我们可
print("In return")
return self.dispatch_return(frame, arg)
if event == 'exception':
print("In execption")
print("In exception")
return self.dispatch_exception(frame, arg)
if event == 'c_call':
print("In c_call")
Expand Down
4 changes: 2 additions & 2 deletions pvm/11closure.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ if __name__ == '__main__':
print(outer_function.__code__.co_cellvars) # ('x', )
```

cellvars 表示在其他函数当中会使用本地定义的变量,freevars 表示本地会使用其他函数定义的变量。在上面的例子当中,outer_function 当中的变量 x 会被 inner_function 使用,而cellvars 表示在其他函数当中会使用本地定义的变量,所以 outer_function 的这个字段为 ('x', )。如果要了解详细的信息可以参考这篇文章 [深入理解 python 虚拟机:字节码灵魂——Code obejct](https://github.com/Chang-LeHung/dive-into-cpython/blob/master/pvm/02codeobject.md#深入理解-python-虚拟机字节码灵魂code-obejct)
cellvars 表示在其他函数当中会使用本地定义的变量,freevars 表示本地会使用其他函数定义的变量。在上面的例子当中,outer_function 当中的变量 x 会被 inner_function 使用,而cellvars 表示在其他函数当中会使用本地定义的变量,所以 outer_function 的这个字段为 ('x', )。如果要了解详细的信息可以参考这篇文章 [深入理解 python 虚拟机:字节码灵魂——Code object](https://github.com/Chang-LeHung/dive-into-cpython/blob/master/pvm/02codeobject.md#深入理解-python-虚拟机字节码灵魂code-object)

>上面的内容我们简要回顾了一下 CodeObject 当中的两个非常重要的字段,这两个字段在进行传递参数的时候非常重要,当我们在进行函数调用的时候,虚拟机会新建一个栈帧,在进行新建栈帧的过程当中,如果发现 co_cellvars 存储的字符串变量也是函数参数的时候,除了会在局部变量当中保存一份参数之外,还会将传递过来的参数保存到栈帧对象的其他位置当中(这里需要注意一下,CodeObject 当中的 co_freevars 保存的是字符串,也就是变量名,栈帧当中保存的是变量名字对应的真实对象,也就是函数参数),这么做的目的是为了方面后面字节码 LOAD_CLOSURE 的操作,因为实际虚拟机存储的是指向对象的指针,因此浪费不了多少空间。
>
Expand Down Expand Up @@ -162,7 +162,7 @@ Disassembly of <code object inner_function at 0x100757a80, file "closure_bytecod

我们再来看一下函数 inner_function 的字节码

- LOAD_DEREF:这个字节码会从栈帧的 freevars 数组当中加载下标为 oparg 的对象,freevars 就是刚刚在创建函数的时候所保存的,也就是 outter_function 传递给 inner_function 的元祖。直观的来说就是将外部函数的 x 加载到 valuestack 当中。
- LOAD_DEREF:这个字节码会从栈帧的 freevars 数组当中加载下标为 oparg 的对象,freevars 就是刚刚在创建函数的时候所保存的,也就是 outer_function 传递给 inner_function 的元祖。直观的来说就是将外部函数的 x 加载到 valuestack 当中。
- STORE_DEREF:就是将栈顶的元素弹出,保存到 cellvars 数组对应的下标 (oparg) 当中。

后续的字节码就很简单了,这里不做详细分析了。
Expand Down
Loading

0 comments on commit 82fd2c8

Please sign in to comment.