//our root app component
import {Component, NgModule, Input, Output, EventEmitter, HostBinding, HostListener} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'
@Component({
selector: 'person',
//template will NOT be inherited
template: `<h4>Person: {{name}}</h4>`
})
export class Person {
@Input() name; //will be inherited
// @Output() onClick = new EventEmitter(); //will be inherited
// clicked() { //will be inherited
// this.onClick.emit(this.name);
// }
@HostBinding('style.color') color = 'red'; //will be inherited
@HostListener('click', ['$event']) //will be inherited
onClick(e){
console.log(this.name);
}
}
@Component({
selector: 'employee',
template: `
<h4>Employee: {{name}}, id: {{id}}</h4>
`
})
export class Employee extends Person {
@Input() id; // new
@HostListener('click', ['$event']) // overridden
onClick(e) {
console.log(`${this.name}-${this.id}`);
}
}
@Component({
selector: 'my-app',
template: `
<div>
<person name="John"></person>
<employee name="Tom" id="45231"></employee>
</div>
`,
})
export class App { }
@NgModule({
imports: [ BrowserModule ],
declarations: [ App, Person, Employee ],
bootstrap: [ App ]
})
export class AppModule {}
如果命令行上的参数计数不等于2但是给我一个分段错误,为什么函数argCount会正确执行?该程序的整体控制流程似乎正常工作。也许函数序言或结语有问题吗?
答案 0 :(得分:0)
直接问题是whereQuery.put("age", new BasicDBObject('$gt', 30))
// ^ ^ here
末尾的ret
出错了,因为它没有有效的回复地址。
此外,如果您打算使用libc,则应使用argCount
,并且还要小心按照ABI维护所需的堆栈对齐。使用帧指针是可选的,并且通常对任何事情都没有帮助,所以我省略了它。
这是一个可能的版本:
main
确保使用 .globl main
main: # main because we use libc
subl $12, %esp # stack alignment
movl 16(%esp), %eax # argc
cmpl $2, %eax
movl $msg3, (%esp) # preset for msg3
jne argCount # if argc!=2 use that
movl $msg2, (%esp) # otherwise msg2
movl %eax, 4(%esp) # and argc
argCount:
call printf # print
call exit # exit
.data
msg2: .asciz "Arg Count = %d\n"
msg3: .asciz "This program takes 1 argument -> sizeOfArray\n"
进行编译和链接,以便正确引入libc,如果您在64位环境中生成32位程序,则提供gcc
(因为此代码仅适用于32位)。
答案 1 :(得分:0)
这些行错了:
cmp $2, %eax
jne argCount
CALL
做了两件事:
如果使用Jcc
或JMP
指令调用函数,则需要手动将返回地址压入堆栈,以使代码正常工作。
push return_address
jmp argCount
return_address:
如果您使用条件跳转,这将导致问题,因为当您编写代码时,您无法预测分支是否被采用(因此在被调用时RET
函数已经从你的堆栈中弹出了返回地址,或者你需要自己处理它。)
你应该做的是:
cmp $2, %eax
je skip_argcount_call
call argCount
skip_argcount_call: