git.asbjorn.biz
/
swftools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
use label more sparingly, it might confuse the verifier
[swftools.git]
/
lib
/
as3
/
parser.y
diff --git
a/lib/as3/parser.y
b/lib/as3/parser.y
index
2f8212e
..
85304ee
100644
(file)
--- a/
lib/as3/parser.y
+++ b/
lib/as3/parser.y
@@
-87,6
+87,7
@@
%token<token> KW_SET "set"
%token<token> KW_VOID "void"
%token<token> KW_STATIC
%token<token> KW_SET "set"
%token<token> KW_VOID "void"
%token<token> KW_STATIC
+%token<token> KW_INSTANCEOF "instanceof"
%token<token> KW_IMPORT "import"
%token<token> KW_RETURN "return"
%token<token> KW_TYPEOF "typeof"
%token<token> KW_IMPORT "import"
%token<token> KW_RETURN "return"
%token<token> KW_TYPEOF "typeof"
@@
-293,7
+294,7
@@
DECLARE_LIST(state);
namespace_t m##_ns;\
registry_fill_multiname(&m, &m##_ns, x);
namespace_t m##_ns;\
registry_fill_multiname(&m, &m##_ns, x);
-#define MEMBER_MULTINAME(m,f) \
+#define MEMBER_MULTINAME(m,f,n) \
multiname_t m;\
namespace_t m##_ns;\
if(f) { \
multiname_t m;\
namespace_t m##_ns;\
if(f) { \
@@
-307,7
+308,7
@@
DECLARE_LIST(state);
m.type = MULTINAME; \
m.ns =0; \
m.namespace_set = &nopackage_namespace_set; \
m.type = MULTINAME; \
m.ns =0; \
m.namespace_set = &nopackage_namespace_set; \
- m.name = f->name; \
+ m.name = n; \
}
/* warning: list length of namespace set is undefined */
}
/* warning: list length of namespace set is undefined */
@@
-526,8
+527,9
@@
static void startclass(int flags, char*classname, classinfo_t*extends, classinfo
state->cls->abc = abc_class_new(global->file, &classname2, extends2);
if(flags&FLAG_FINAL) abc_class_final(state->cls->abc);
state->cls->abc = abc_class_new(global->file, &classname2, extends2);
if(flags&FLAG_FINAL) abc_class_final(state->cls->abc);
- if(flags&FLAG_DYNAMIC) abc_class_sealed(state->cls->abc);
+ if(!(flags&FLAG_DYNAMIC)) abc_class_sealed(state->cls->abc);
if(interface) abc_class_interface(state->cls->abc);
if(interface) abc_class_interface(state->cls->abc);
+ abc_class_protectedNS(state->cls->abc, classname);
for(mlist=implements;mlist;mlist=mlist->next) {
MULTINAME(m, mlist->classinfo);
for(mlist=implements;mlist;mlist=mlist->next) {
MULTINAME(m, mlist->classinfo);
@@
-931,7
+933,7
@@
code_t*defaultvalue(code_t*c, classinfo_t*type)
} else if(TYPE_IS_UINT(type)) {
c = abc_pushuint(c, 0);
} else if(TYPE_IS_FLOAT(type)) {
} else if(TYPE_IS_UINT(type)) {
c = abc_pushuint(c, 0);
} else if(TYPE_IS_FLOAT(type)) {
- c = abc_pushdouble(c, 0.0);
+ c = abc_pushnan(c);
} else if(TYPE_IS_BOOLEAN(type)) {
c = abc_pushfalse(c);
} else {
} else if(TYPE_IS_BOOLEAN(type)) {
c = abc_pushfalse(c);
} else {
@@
-1243,6
+1245,8
@@
IF : "if" '(' {new_state();} EXPRESSION ')' CODEBLOCK MAYBEELSE {
myif->branch = $$ = abc_label($$);
if($7) {
$$ = code_append($$, $7);
myif->branch = $$ = abc_label($$);
if($7) {
$$ = code_append($$, $7);
+ // might use a nop here too, depending on whether
+ // the code $7 reaches the end or not
myjmp->branch = $$ = abc_label($$);
}
myjmp->branch = $$ = abc_label($$);
}
@@
-1256,7
+1260,7
@@
FOR_INIT : VOIDEXPRESSION
FOR : "for" '(' {new_state();} FOR_INIT ';' EXPRESSION ';' VOIDEXPRESSION ')' CODEBLOCK {
$$ = code_new();
$$ = code_append($$, $4);
FOR : "for" '(' {new_state();} FOR_INIT ';' EXPRESSION ';' VOIDEXPRESSION ')' CODEBLOCK {
$$ = code_new();
$$ = code_append($$, $4);
- code_t*loopstart = $$ = abc_label($$);
+ code_t*loopstart = $$ = abc_nop($$);
$$ = code_append($$, $6.c);
code_t*myif = $$ = abc_iffalse($$, 0);
$$ = code_append($$, $10);
$$ = code_append($$, $6.c);
code_t*myif = $$ = abc_iffalse($$, 0);
$$ = code_append($$, $10);
@@
-1271,13
+1275,14
@@
FOR : "for" '(' {new_state();} FOR_INIT ';' EXPRESSION ';' VOIDEXPRESSION ')' CO
WHILE : "while" '(' {new_state();} EXPRESSION ')' CODEBLOCK {
$$ = code_new();
WHILE : "while" '(' {new_state();} EXPRESSION ')' CODEBLOCK {
$$ = code_new();
+
code_t*myjmp = $$ = abc_jump($$, 0);
code_t*loopstart = $$ = abc_label($$);
$$ = code_append($$, $6);
code_t*myjmp = $$ = abc_jump($$, 0);
code_t*loopstart = $$ = abc_label($$);
$$ = code_append($$, $6);
- myjmp->branch = $$ = abc_label($$);
+ myjmp->branch = $$ = abc_nop($$);
$$ = code_append($$, $4.c);
$$ = abc_iftrue($$, loopstart);
$$ = code_append($$, $4.c);
$$ = abc_iftrue($$, loopstart);
- code_t*out = $$ = abc_label($$);
+ code_t*out = $$ = abc_nop($$);
breakjumpsto($$, out);
$$ = killvars($$);old_state();
breakjumpsto($$, out);
$$ = killvars($$);old_state();
@@
-1891,6
+1896,12
@@
E : E "as" E {char use_astype=0; // flash player's astype works differently than
}
}
}
}
+E : E "instanceof" E
+ {$$.c = code_append($1.c, $3.c);
+ $$.c = abc_instanceof($$.c);
+ $$.t = TYPE_BOOLEAN;
+ }
+
E : E "is" E {$$.c = code_append($1.c, $3.c);
$$.c = abc_istypelate($$.c);
$$.t = TYPE_BOOLEAN;
E : E "is" E {$$.c = code_append($1.c, $3.c);
$$.c = abc_istypelate($$.c);
$$.t = TYPE_BOOLEAN;
@@
-2081,7
+2092,7
@@
E : "super" '.' T_IDENTIFIER
memberinfo_t*f = registry_findmember(t, $3);
namespace_t ns = {flags2access(f->flags), ""};
memberinfo_t*f = registry_findmember(t, $3);
namespace_t ns = {flags2access(f->flags), ""};
- MEMBER_MULTINAME(m, f);
+ MEMBER_MULTINAME(m, f, $3);
$$.c = 0;
$$.c = abc_getlocal_0($$.c);
$$.c = abc_getsuper2($$.c, &m);
$$.c = 0;
$$.c = abc_getlocal_0($$.c);
$$.c = abc_getsuper2($$.c, &m);
@@
-2104,7
+2115,7
@@
E : E '.' T_IDENTIFIER
if(f && f->slot && !noslot) {
$$.c = abc_getslot($$.c, f->slot);
} else {
if(f && f->slot && !noslot) {
$$.c = abc_getslot($$.c, f->slot);
} else {
- MEMBER_MULTINAME(m, f);
+ MEMBER_MULTINAME(m, f, $3);
$$.c = abc_getproperty2($$.c, &m);
}
/* determine type */
$$.c = abc_getproperty2($$.c, &m);
}
/* determine type */